我嘗試過幾件事情,並且每次嘗試都遇到不同的錯誤。首先,我正在用'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