读取某些格式错误的csv文件并将错误的行返回给用户

问题描述 投票:2回答:1

我有一些用户上传要提取的csv文件。在Python 2中,我能够打开二进制文件,并将其传递给unicodecsv.DictReader,如果某些行存在编码问题,例如无效的Unicode字符,因为客户使用了CP1251或其他东西,则可以记录这些行并确切返回哪些行出了问题。

[使用py3.7,看来我无法做到这一点-csv模块要求对文件进行解码,如果我将其传递给像(line.decode('utf8') for line in my_binary_file)这样的生成器,则无法实现仅针对坏行抛出异常并继续执行。我尝试使用unicodecsv,即使它已经四年没有提交了,并且在技术上不支持py> 3.5,而且似乎也不起作用-迭代器仅在出现问题之后停了下来。

我可以看到两种解决方法,两种方法都没有吸引力:1)预先逐行解码文件并找到坏行,这很浪费,或者2)编写我自己的CSV分析器,该分析器允许跳过不良行,这似乎很麻烦。

我可以用另一种方式吗?

作为参考,这是在py2中工作的示例代码:

def unicode_safe_iterator(reader):
    while True:
        try:
            yield True, next(reader)
        except UnicodeDecodeError as exc:
            yield False, 'UnicodeDecodeError: %s' % str(exc)
        # uncomment for py3:
        # except StopIteration:
        #     return

def get_data_iter_from_csv(csv_file, ...):
    reader = unicodecsv.DictReader(csv_file)
    error_messages = []
    line_num = 1
    for valid, row in unicode_safe_iterator(reader):
        line_num += 1
        if not valid:
            error_messages.append(dict(line_number=line_num, error=row))
        else:
            row_data = validate_row_data(row)  # check for errors other than encoding, etc.
        if not error_messages:
            # stop yielding in case of errors, but keep iterating to find all errors.
            yield row_data
    if error_messages:
        raise ValidationError(Errors.CSV_FILE_ERRORS, error_items=error_messages)


data_iter = get_data_iter_from_csv(open(path_to_csv, 'rb'), ...)
python python-3.x csv unicode python-unicode
1个回答
1
投票

您可以使用熊猫来读取utf-8格式的csv文件

import pandas as pd
data = pd.read_csv("path_to_csv",encoding = 'utf-8')

要使用此解决方案,您需要使用pip安装熊猫在终端中运行此命令

pip install pandas
© www.soinside.com 2019 - 2024. All rights reserved.