0

(这个问题与这个有关)

我正在阅读解析 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
4

2 回答 2

3

csv模块包含以下警告:

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

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

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

txt = txt.encode()

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

于 2013-06-05T20:30:19.733 回答
1

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

于 2013-06-05T20:44:27.887 回答