我有一些用户上传要提取的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'), ...)
您可以使用熊猫来读取utf-8格式的csv文件
import pandas as pd
data = pd.read_csv("path_to_csv",encoding = 'utf-8')
要使用此解决方案,您需要使用pip安装熊猫在终端中运行此命令
pip install pandas