【问题标题】:python Dictread of CSV file with NUL bytes in data数据中包含 NUL 字节的 CSV 文件的 python Dictread
【发布时间】:2014-01-07 21:08:46
【问题描述】:

我有一个 CSV 文件,它在一些数据中嵌入了 NUL 字节。

这是给定的列 A B C D 列 C 中的一个字段将具有类似的数据

, 引号字符"Some Data" NUL "More Data" NUL "End of data" 引号字符,

当我用 LIBRE Office Calc 打开它时,NUL 字符不会出现在显示屏上,如果我手动保存它,它们就会消失。我可以在 vi 中看到 NUL 字符,并且可以使用 tr 或在 vi 中手动删除或替换它们,但我希望能够使用 python 程序自动处理它。

DictReader 进程是

for row in infile: 抛出异常,因此异常在循环之外,不会返回获取下一行(或允许我将 NUL 字符更改为空格或嵌入的逗号并处理该行) .

幸运的是,数据似乎还有其他失效,所以无论如何我都可能会跳过它。但是,问题是我如何告诉 Python 转到下一行。

【问题讨论】:

  • 请显示您的实际循环作为参考点。

标签: python design-patterns csv


【解决方案1】:

所以这有点难看,但它似乎工作。您可以像平常一样读取一行,清除有问题的字节,然后使用 StringIO 对象将其传递给 DictReader。这是代码,假设你的 csv 有一个标题记录(如果你没有,它应该更简单):

#!/usr/bin/env python

import StringIO
import csv 
import ipdb

fin = open('somefilewithnulls', 'rb')
fout = StringIO.StringIO()
reader = csv.DictReader(fout)

while True:
    # for the first record prep StringIO with the first
    # two lines so DictReader can create header
    line = fin.readline() if fin.tell() else fin.readline() + fin.readline()
    if not len(line):
        break

    # clean the line before passing it to DictReader
    line = line.replace('\x00', '') 

    fout.write(line)
    fout.seek(-len(line), 1)

    rec = reader.next()
    print rec

【讨论】:

  • 谢谢。现在,我在 bash 中有一个预处理器,使用 tr 来清理文件,因为它们最初是在处理字典中设置的。以后我会牢记这一点,以便它可以成为 python 处理的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 2020-09-21
  • 2021-12-17
相关资源
最近更新 更多