我尝试过几件事情,并且每次尝试都遇到不同的错误。首先,我正在用'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
对象,要求他们是字符串的一些改变。我正在以正确的方式来解决这个问题吗?
+1。这是Python 2和Python 3的区别。Python 3在打开文件时必须使用文本模式,因为它需要将内容作为Unicode字符串读取。如果需要,您也可以设置编码(如果Excel表格包含使用特定编码的文本)。 – pepr 2013-02-09 17:02:10
@pepr感谢您解释此修复程序。我不确定它为什么运作,但认为它是由于3.x和2.x的差异。 – PFranchise 2013-02-09 20:16:50
在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