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

kmynzznz  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(112)

我有以下代码:

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字节附近截断它。是这样吗?这个界限在哪里定义?

rqenqsqc

rqenqsqc1#

文件中有无效的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)
wqsoz72f

wqsoz72f2#

文件大小不是真实的的问题,请参阅例外:
Unicode解码错误:'utf-8'编解码器无法解码位置7206中的字节0xa 0:无效起始字节
你应该先解决编码问题

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

这将忽略编码错误

相关问题