python csv 読み込み




Python 2.4 CSVリーダーで引用符を無効にするにはどうすればよいですか? (2)

+1トリプティク

csv.readerが引用符なしでcsvファイルを自動的に処理することの確認:

>>> import StringIO
>>> import csv
>>> data="""
... 1,2,3,4,5
... 1,2,3,4,5
... 1,2,3,4,5
... """
>>> reader=csv.reader(StringIO.StringIO(data))
>>> for i in reader:
...     print i
... 
[]
['1', '2', '3', '4', '5']
['1', '2', '3', '4', '5']
['1', '2', '3', '4', '5']

私は制御しない大規模で定期的に更新されたCSVファイルを解析する必要のあるPythonユーティリティを書いています。 ユーティリティは、Python 2.4のみを使用できるサーバー上で実行する必要があります。 CSVファイルはフィールド値を一切引用しませんが、csvライブラリのPython 2.4バージョンでは引用符を無効にする方法はありません。引用符文字を設定することができます( dialect.quotechar = '"'引用符をNoneまたは空の文字列に設定しようとすると、エラーが発生します。

私はdialect.quotecharをいくつかの "まれな"文字に設定することでこれを回避することができますが、ASCII文字がないので、これは脆いです。フィールド値に表示されないことを絶対に保証することができますdialect.quotechar = dialect.delimiter 、物事は予想通りに動かない)。

Python 2.5以降ではcsv.QUOTE_NONEcsv.QUOTE_NONEに設定すると、CSVリーダーはそれを尊重し、任意の文字を引用文字として解釈しません。 Python 2.4でこの動作を複製する方法はありますか?

更新 :問題を絞り込むのを手伝ってくれたTriptychとMark Roddyに感謝します。 ここでは最も簡単なケースのデモンストレーションです:

>>> import csv
>>> import StringIO
>>> data = """
... 1,2,3,4,"5
... 1,2,3,4,5
... """
>>> reader = csv.reader(StringIO.StringIO(data))
>>> for i in reader: print i
... 
[]
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
_csv.Error: newline inside string

この問題は、行の最後の列に二重引用符が1つしかない場合に発生します。 残念ながら、この状況は私のデータセットにあります。 私はTanjの解答を受け入れました。引用符として非印字文字( "\x07"またはBEL )を手動で割り当てます。 これはハッキーですが、うまくいきますが、私はまだ別の解決策を見ていません。 実際のソリューションのデモは次のとおりです。

>>> import csv
>>> import StringIO
>>> class MyDialect(csv.Dialect):
...     quotechar = '\x07'
...     delimiter = ','
...     lineterminator = '\n'
...     doublequote = False
...     skipinitialspace = False
...     quoting = csv.QUOTE_NONE
...     escapechar = '\\'
... 
>>> dialect = MyDialect()
>>> data = """
... 1,2,3,4,"5
... 1,2,3,4,5
... """
>>> reader = csv.reader(StringIO.StringIO(data), dialect=dialect)
>>> for i in reader: print i
... 
[]
['1', '2', '3', '4', '"5']
['1', '2', '3', '4', '5']

Python 2.5以降では、csv.QUOTE_NONEを指定するだけで十分であり、 quotecharの値は無関係になります。 (私は実際にcsv.Sniffer経由で私の最初の方言を得ていますし、csv.Dialectをサブクラス化するのではなく、quotecharの値を上書きしますが、実際の問題から気をそらさないようにしたいと思います; Snifferは問題ではありません。)


私はPython 2.4.3を使っていくつかの例を試しましたが、フィールドが引用符で囲まれていないことを検出するのに十分なように思えました。

私はあなたがすでに(ちょっとハッキーな)答えを受け入れたことは知っていますが、 reader.dialect.quotechar値だけを残してreader.dialect.quotecharたか? もしあなたがしたらどうなりますか?

私たちは入力の例を得ることができますか?







csv