Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-处理CSV文件中的数据错误_Python_Python 3.x_Csv - Fatal编程技术网

Python-处理CSV文件中的数据错误

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

我有一个CSV文件,在某些行上可能有无效的UTF-8编码。该文件有时有数十万行长,因此我只想跳过包含无效字符的行(注意)以获得99.9%的有效行(对于这个应用程序,输入中的每一行都进入数据库不是必需的)

我的Python代码如下所示:

# 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: