我在csv.reader
周围创建一个包装器,即使它遇到格式错误的行(即具有NULL字节的行),也会让读者继续工作。它看起来像:
def error_ignoring_csv_reader(csv_reader):
while True:
try:
yield next(csv_reader)
except csv.Error, e:
logger.warning("Got badly formed line with error [%s]" % e)
我真正想要做的是将原始有问题的行包含在已记录的警告中#34;格式错误的行[actual_raw_line]
",但阅读csv'源代码,我还没有找到任何访问它的方法。是否可以访问我们在csv.reader中处理的原始未处理的当前行?
答案 0 :(得分:0)
虽然我不知道直接在csv.reader中访问原始的,未处理的当前行的方法,但这些对象确实提供了csvreader.line_num属性,可以为获取当前行提供基础。
csv.reader的csvfile参数“可以是任何支持迭代器协议的对象,并且每次调用next()方法时都返回一个字符串”,因此它不必是普通文件。参考文档特别提到了一个字符串列表作为选项。
如果您可以先将文件读入列表,则可以使用line_num属性在出现错误时将其编入索引。或者您可以返回并重新读取文件中的行以查找有问题的行。
或者您可以构建一个自定义迭代器,该文件从文件中读取并记住最后一行读取。 (使用最后一种方法,您的代码将创建您的特殊迭代器并将其传递给csv.reader。在这种情况下您甚至不需要使用line_num属性。)