我有以下代码:
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字节的中间截断它。那是对的吗?这个限制在哪里定义?
答案 0 :(得分:0)
您的文件中包含无效的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)
答案 1 :(得分:0)
文件大小不是真正的问题 看到例外:
UnicodeDecodeError:' utf-8'编解码器不能解码位置7206中的字节0xa0:无效的起始字节
您应该首先处理编码问题
with open(filename, 'rt', encoding='utf-8', errors='ignore') as csvfile:
将忽略编码错误