Python-处理CSV文件中的数据错误
我有一个CSV文件,在某些行上可能有无效的UTF-8编码。该文件有时有数十万行长,因此我只想跳过包含无效字符的行(注意)以获得99.9%的有效行(对于这个应用程序,输入中的每一行都进入数据库不是必需的) 我的Python代码如下所示:Python-处理CSV文件中的数据错误,python,python-3.x,csv,Python,Python 3.x,Csv,我有一个CSV文件,在某些行上可能有无效的UTF-8编码。该文件有时有数十万行长,因此我只想跳过包含无效字符的行(注意)以获得99.9%的有效行(对于这个应用程序,输入中的每一行都进入数据库不是必需的) 我的Python代码如下所示: # Iterate through the CSV file with open(fileName, "rt", encoding="utf8") as csvFile: try: reader = csv.DictReader(csvFi
# Iterate through the CSV file
with open(fileName, "rt", encoding="utf8") as csvFile:
try:
reader = csv.DictReader(csvFile)
for csvDataRow in reader:
try:
log.debug('Row '+str(lineNo))
#
# .. row handling code here ..
#
except Exception as e:
log.error('Exception at the for loop level\n'+str(e))
except Exception as e:
log.error('Exception at the reader level\n'+str(e))
我所期望的是,无效数据将在for循环级别触发异常,因此我可以在那里捕获UnicodeEncodingError并跳过该行,然后继续循环
问题是异常不会在那里触发-它会在读取器级别命中except子句-即循环上下文之外。因此,我不能再继续在for循环中对行进行迭代
最终的结果是,如果我在CSV文件的第674398行命中一个无效行,该行总共有2966480行,则异常会导致跳过第674398行之后的行。在本例中,结果是输入中的行有一个无效的连续字符,它会破坏UTF-8解析器。我花了相当多的时间阅读Python CSV文档并四处搜索以找到解决方案。关键似乎是,例外情况来自这一行:
for csvDataRow in reader:
i、 e.在调用DictReader迭代器以获取下一行时触发。CSV文档中没有提到如何处理这样的错误
诀窍在于编码转换不是发生在CSV中,而是发生在它的下面,因此需要的更改是在开放调用中
将errors=“replace”添加到打开调用会导致编解码器转换用“?”替换输入中的任何无效字符
with open(fileName, "rt", encoding="utf8", errors="replace") as csvFile:
我花了相当多的时间阅读Python CSV文档并四处搜索以找到解决方案。关键似乎是,例外情况来自这一行:
for csvDataRow in reader:
i、 e.在调用DictReader迭代器以获取下一行时触发。CSV文档中没有提到如何处理这样的错误
诀窍在于编码转换不是发生在CSV中,而是发生在它的下面,因此需要的更改是在开放调用中
将errors=“replace”添加到打开调用会导致编解码器转换用“?”替换输入中的任何无效字符
with open(fileName, "rt", encoding="utf8", errors="replace") as csvFile: