【问题标题】:CSV reader: line contains NULL byteCSV 阅读器:行包含 NULL 字节
【发布时间】:2013-06-05 19:27:28
【问题描述】:

(此问题与this one有关)

我正在读取解析 csv 内容,该内容之前已加载到内存中:

def ReadTxtIntoColumns(txt, columns):
    rows = []
    print txt
    print txt.find('\x00')
    print txt.count('\x00')
    f = StringIO(txt)
    try:
        reader = csv.reader(f, delimiter=' ', skipinitialspace=True)
        for row in reader:
            # Merge all extra columns
            if len(row) >= columns:
                rest = ' '.join(row[columns-1:])
                del row[columns-1:]
                row.append(rest)
            # And now set missing columns to None
            for i in range (len (row), columns):
                row.append(None)
            rows.append(row)
    except csv.Error, e:
        log.error('ReadTxtIntoColumns > Problems reading csv from string > line %d: %s', reader.line_num, e)
    finally:
        f.close()
    return rows

输入数据是我手写的(一个简单的文本文件,空格分隔)。我的输入数据中根本没有 '\x00',但 csv 抱怨它:

ReadTxtIntoColumns > Problems reading csv from string > line 1: line contains NULL byte

那么错误信息是什么意思呢?

编辑

这是我的简化输入数据,我已经验证它仍然会导致同样的问题:

#COMMAND                      USER        DIRECTORY                        SAFE   COMMAND
uname                         -            -                               FALSE  uname -a
sleep                         -            -                               FALSE  sleep 100

【问题讨论】:

  • 您不需要将输入包装在StringIO 对象中;只需传入任何可迭代的;例如,text.splitlines(True) 就可以了。
  • 你能给我们一个最小的样本text 值来重现问题吗?
  • numpy.loadtxt 不适合您的情况吗?
  • @Martijn Pieters:添加了输入数据。有趣的是,我在一个系统中遇到了这个问题,但在另一个系统中没有。 csv 库在两者中都是相同的。一个是python 2.7.3(ok),另一个是2.7.2(error)
  • @gonvaled:是否涉及任何 Unicode?​​span>

标签: python


【解决方案1】:

csv module 包含以下警告:

此版本的 csv 模块不支持 Unicode 输入。此外,目前还有一些关于 ASCII NUL 字符的问题。因此,为了安全起见,所有输入都应该是 UTF-8 或可打印的 ASCII;请参阅示例部分中的示例。

StringIO.StringIO 对象支持 unicode,但如果您使用的是 cStringIO 模块,则 cStringIO.StringIO 不支持,并且会导致更多问题。

如果您的数据仅为 ASCII,只需先编码 txt

txt = txt.encode()

2.7.3 中可能添加了一些修复程序,使问题不那么明显。

【讨论】:

    【解决方案2】:

    csv 模块在从 Unicode 编码文件中读取数据时出现问题。当我将它粘贴到 python 解释器并使用手动输入的文本字符串调用它时,您的代码可以工作,因此如果您尝试以 ANSI/ASCII 格式保存文件,或者在将其加载到内存时将其转换为 ASCII,它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 2014-11-20
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      相关资源
      最近更新 更多