为什么当文件大小大于40K字节时csv.reader会失败?

问题描述 投票:0回答:2

我有以下代码:

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 字节周围(中间)截断它。那是对的吗?这个限制是在哪里定义的?

python python-3.x csv file reader
2个回答
1
投票

您的文件中包含无效的 UTF-8 数据。这与

csv
模块无关,也与文件大小无关;您的较大文件中包含无效数据,而较小的文件中则没有。简单地做:

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

应该会触发相同的错误,这纯粹是遇到无效的 UTF-8 字节的问题,这表明您的文件要么不是 UTF-8 开头,要么已以某种方式损坏。

如果您的文件实际上是不同的编码(例如

latin-1
cp1252
等;
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)

0
投票

文件大小不是真正的问题 查看异常:

UnicodeDecodeError:“utf-8”编解码器无法解码位置 7206 中的字节 0xa0:无效的起始字节

你应该首先处理编码问题

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

这将忽略编码错误

© www.soinside.com 2019 - 2024. All rights reserved.