2013-02-08 85 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

相關問題