2016-01-30 87 views
3

我正在翻譯以下Kaggle代碼到Python3.4:Python3 CSV writerows,類型錯誤: 'STR' 不支持緩衝器接口

在最後的線輸出的CSV文件時,

predictions_file = open("myfirstforest.csv", "wb") 
open_file_object = csv.writer(predictions_file) 
open_file_object.writerow(["PassengerId","Survived"]) 
open_file_object.writerows(zip(ids, output)) 
predictions_file.close() 
print('Done.') 

有一個類型錯誤

TypeError: 'str' does not support the buffer interface 

發生在該行open_file_object.writerow(["PassengerId","Survived"])

我相信這是因爲以二進制模式打開文件來編寫csv數據在Python 3中不起作用。但是,在open()行中添加encoding='utf8'也不起作用。

在Python3.4中這樣做的標準方式是什麼?

回答

5

創建一個CSV文件的Python 2和Python 3之間的不同(一看到文檔的csv module會顯示):

而不是

predictions_file = open("myfirstforest.csv", "wb") 

你需要使用

predictions_file = open("myfirstforest.csv", "w", newline="") 

(如果發生錯誤,您應該使用上下文管理器來處理文件的關閉):

with open("myfirstforest.csv", "w", newline="") as predictions_file: 
    # do stuff 
# No need to close the file 
+0

「作爲csv模塊的文檔的一個看看會顯示」我意識到這一點(並在原始問題中用英文提到它)。我不明白這個錯誤是由'newline ='「''引起的,這就是我爲什麼要澄清的原因。我爲你造成這樣的痛苦表示歉意。 – ShanZhengYang

+1

@ShanZhengYang爲清楚起見:''wb''以二進制模式打開文件,因此'.write()'需要二進制數據,例如'bytes'對象,而不是'str',這是Python 3中的Unicode。''w ''以文本模式打開文件:'.write()'期望'str'。 Python 3.5會產生更多可理解的錯誤信息:'TypeError:需要類似字節的對象,而不是'str''。 'newline =「」'與問題無關,但推薦用於'csv'文件(即使在Unix上,'csv'模塊也使用'b'\ r \ n'';'newline ='''允許不用寫新行通常的通用換行符模式轉換(''\ n'' - >'os.linesep'))。 – jfs

相關問題