3 回答

TA貢獻2019條經驗 獲得超9個贊
正如@ S.Lott所說,您應該以“ rb”模式而不是“ rU”模式打開文件。但是,這可能不會引起您當前的問題。據我所知,如果\r數據中嵌入了“ rU”模式,則會使您大失所望,但不會引起任何其他麻煩。我還注意到您有幾個文件(全部以'rU'??打開),但只有一個會引起問題。
如果csv模塊說您的文件中有一個“ NULL”(愚蠢的消息,應為“ NUL”)字節,那么您需要檢查文件中的內容。即使使用'rb'可以使問題消失,我還是建議您這樣做。
repr()是(或想成為)調試朋友。它會以獨立于平臺的方式明確顯示您所擁有的內容(這對不知道od是什么或做什么的幫助者很有幫助)。做這個:
print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file
并仔細地將結果復制/粘貼(請勿重新輸入)以編輯您的問題(而不是評論)。
還要注意,如果文件確實很模糊,例如距文件開頭的合理距離內沒有\ r或\ n,則報告的行號reader.line_num將(無益)1. \x00通過執行以下操作查找第一個行(如果有)
data = open('my.csv', 'rb').read()
print data.find('\x00')
并確保至少使用repr或od轉儲那么多字節。
是什么data.count('\x00')告訴你嗎?如果有很多,您可能想要做類似的事情
for i, c in enumerate(data):
if c == '\x00':
print i, repr(data[i-30:i]) + ' *NUL* ' + repr(data[i+1:i+31])
這樣您就可以在上下文中看到NUL字節。
如果你可以看到\x00在輸出(或者\0在你的od -c輸出),那么你肯定有在文件中NULL字節(S),你需要做這樣的事情:
fi = open('my.csv', 'rb')
data = fi.read()
fi.close()
fo = open('mynew.csv', 'wb')
fo.write(data.replace('\x00', ''))
fo.close()
順便說一句,您是否使用文本編輯器查看了文件(包括最后幾行)?它實際上看起來像其他文件(沒有“ NULL字節”例外)一樣合理的CSV文件嗎?

TA貢獻1789條經驗 獲得超8個贊
將其讀取為UTF-16也是我的問題。
這是我的代碼,最終起作用了:
f=codecs.open(location,"rb","utf-16")
csvread=csv.reader(f,delimiter='\t')
csvread.next()
for row in csvread:
print row
其中location是您的csv文件的目錄。

TA貢獻1982條經驗 獲得超2個贊
我也遇到了這個問題。使用Python csv模塊,我試圖讀取在MS Excel中創建的XLS文件,NULL byte并遇到遇到的錯誤。我環顧四周,發現了xlrd Python模塊,用于從MS Excel電子表格文件讀取和格式化數據。使用該xlrd模塊,我不僅能夠正確讀取文件,而且還可以以前所未有的方式訪問文件的許多不同部分。
我認為這可能對您有幫助。
添加回答
舉報