为什么文件大小大于 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-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)
文件大小不是真正的问题
查看异常:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 7206: invalid start byte
你应该首先处理编码问题
with open(filename, 'rt', encoding='utf-8', errors='ignore') as csvfile:
这将忽略编码错误
我有以下代码:
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-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)
文件大小不是真正的问题 查看异常:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 7206: invalid start byte
你应该首先处理编码问题
with open(filename, 'rt', encoding='utf-8', errors='ignore') as csvfile:
这将忽略编码错误