2013-02-08 70 views
1

我尝试过几件事情,并且每次尝试都遇到不同的错误。首先,我正在用'r''w'选项读写,但是这导致在excel中查看时导致csv在实际行之间出现空行。从excel CSV读取并写入另一个的问题

所以,我发现我必须用'rb''wb'来读写。但是,现在我收到错误:_csv.Error iterator should return strings, not bytes (did you open the file in text mode?)

这里是我的代码:

def readLines(): 
    r = csv.reader(open('test.csv', "rb"), dialect="excel") 
    return [l for l in r] #causes the error 

def writeFile(lines): 
    resultFile = open('output.csv', 'wb') 
    wr = csv.writer(resultFile, dialect='excel') 
    wr.writerows(lines) 

我做lines对象,要求他们是字符串的一些改变。我正在以正确的方式来解决这个问题吗?

回答

2

的问题是,我并没有设定新的行属性。

这是我更新的代码,现在工作:

def readLines(): 
    r = csv.reader(open('test.csv', "rt", newline=''), dialect="excel") 
    return [l for l in r] 

def writeFile(lines): 
    resultFile = open('output.csv', 'wt', newline='') 
    wr = csv.writer(resultFile, dialect='excel') 
    wr.writerows(lines) 
+1

+1。这是Python 2和Python 3的区别。Python 3在打开文件时必须使用文本模式,因为它需要将内容作为Unicode字符串读取。如果需要,您也可以设置编码(如果Excel表格包含使用特定编码的文本)。 – pepr 2013-02-09 17:02:10

+0

@pepr感谢您解释此修复程序。我不确定它为什么运作,但认为它是由于3.x和2.x的差异。 – PFranchise 2013-02-09 20:16:50

+1

在Python 2中,字符串类型实际上是一系列字节。从二进制文件或文本模式打开的文件中读取它们没有任何区别。这是csv模块使用的(错误)。二进制模式是必需的,因为它不能停止在换行符处进行解析(换行符可能是字符串值的一部分)。在Python 2中,换行符将作为其他字节读取。 Python 3中所需的文本模式需要另一种方式来说明新行不能被解释 - 'newline ='''(参见http://docs.python.org/3.3/library/functions.html#open) 。 'str'和'bytes'是不同的类型。 – pepr 2013-02-09 21:07:24

0

尝试以文本方式打开文件:

r = csv.reader(open('test.csv', "rt"), dialect="excel") 

resultFile = open('output.csv', 'wt') 
+0

我试过了,但它导致了其在我得到的Excel文件中其他行。 – PFranchise 2013-02-08 23:21:56

相关问题