簡體   English   中英

當文件大小大於40K字節時,為什么csv.reader失敗?

[英]Why does csv.reader fail when the file size is larger than 40K bytes?

我有以下代碼:

with open(filename, 'rt') as csvfile:
    csvDictReader = csv.DictReader(csvfile, delimiter=',', quotechar='"')
    for row in csvDictReader:
        print(row)

只要文件大小小於40k字節,該程序就可以正常工作。 當文件大小超過40k時,在嘗試讀取文件時出現此錯誤:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 7206: invalid start byte

實際的文件內容似乎不是問題,僅是文件本身的大小(40k字節確實很小)。

當文件大小大於40K字節時,總是在包含第32K個字節的行上發生錯誤。

我有一種感覺,python毫無例外地無法讀取超過40K字節的文件,而只是在中間將第32K字節附近截斷了文件。 那是對的嗎? 該限制在哪里定義?

您的文件中包含無效的UTF-8數據。 這與csv模塊無關,也與文件大小無關。 您的較大文件中包含無效數據,而較小文件中沒有。 簡單地做:

 with open(filename) as f:
     f.read()

應該會觸發相同的錯誤,這純粹是遇到無效的UTF-8字節的問題,這表明您的文件不是以UTF-8開頭的,或者已經以某種方式損壞了。

如果您的文件實際上是不同的編碼(例如latin-1cp1252等; file命令行實用程序可能有助於識別,但是對於許多ASCII超集編碼,您只需要知道 ),請將其作為encoding參數傳遞給open使用而不是默認的語言環境(在這種情況下為utf-8 ),因此您可以正確解碼字節,例如:

    # Also add newline='' to defer newline processing to csv module, where it's part
    # of the CSV dialect
    with open(filename, encoding='latin-1', newline='') as csvfile:
        csvDictReader = csv.DictReader(csvfile, delimiter=',', quotechar='"')
        for row in csvDictReader:
            print(row)

文件大小不是真正的問題,請參見異常:

UnicodeDecodeError:'utf-8'編解碼器無法解碼位置7206中的字節0xa0:無效的起始字節

您應該首先處理編碼問題

with open(filename, 'rt', encoding='utf-8', errors='ignore') as csvfile:

它將忽略編碼錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM