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オブジェクトはユニコードをサポートしていますが、cStringIOモジュールを使用している場合はサポートさcStringIO.StringIOれておらず、さらに問題が発生する可能性があります。

データが ASCII のみの場合は、txt最初にエンコードするだけです。

txt = txt.encode()

2.7.3 には、問題を目立たなくするいくつかの修正が追加されている可能性があります。

于 2013-06-05T20:30:19.733 に答える