2011-01-31 14 views
5

データがファイル内にないときにPythonでCSVデータを解析する方法はありますか?私は自分のデータベースにCSVデータを保存していますので、解析したいと思います。私はRubyのCSV.parseと類似のものを探しています。私はPythonがCSVクラスを持っていることを知っていますが、ドキュメントで見たことはすべて、メモリ内のCSVデータとは対照的にファイルを扱うようです。PythonのメモリからCSVデータを解析する

(そして、それがデータベースに入る前にデータを解析するためのオプションはありません。)

(そして、データベースにCSVデータを保存しないように私に教えないでください。私は私は何を知っていますデータベースに行く限り)。

+0

"私は自分のデータベースにCSVデータを保存していますので、解析したいと思います。"これはあいまいです。 CSVファイル全体をグロブまたは文字列としてデータベースに保存していますか?すべての情報をデータベースのテーブルに格納していることを意味しますか?各列はCSVフィールドに対応します。 – gotgenes

+0

ファイル全体をBLOBとして保存しています。 –

+1

BLOBの構造は何ですか?代わりにデータをピクルするオプションがありますか? – jbcurtin

答えて

7

python csvモジュールに関するファイルには特別な区別はありません。 StringIOを使用すると、文字列をファイルのようなオブジェクトとしてラップすることができます。ファイルオブジェクトと リストオブジェクトの両方に適している -

+3

ほとんどの場合、[cStringIO](http://docs.python.org/library/stringio.html#module-cStringIO)が適切です。 – gotgenes

1

stringioモジュールを使用すると、文字列をファイルライクなオブジェクトとしてまとめることができます。そうすれば、解析用のCSVモジュール(または使用している他のパーサー)にstringio "ファイル"を渡すことができます。

1

http://docs.python.org/library/csv.html

csv.reader(csvfile) 

たcsvfileはイテレータプロトコルをサポートし は、その次は() メソッドが呼び出されるたびに、文字列を返す 任意のオブジェクトであることができます。

あなたは(Pythonの3.xではio.StringIOcStringIO.StringIOを使用する必要がありますなぜあなたはここで

import csv 

fromDB = "1,2,3\n4,5,6" 

reader = csv.reader(fromDB.split("\n")) 
for row in reader: 
    print("New row") 
    for col in row: 
    print(" ", col) 
+0

-1あなたの答えはドキュメントの簡単なRTFM-Quoteなので、それ以上の説明がない理由や使い方はわかりません。そして、それはOPの質問 –

+0

@マーティンThurauに追加された例(最近のコメントによると、ファイルの内容自体がデータベースに保存され、単一の行ではないDB部分をスキップ)を追加しました – Howard

+0

これは良いです。グッドボーイ;) –

1

のようにそれを解析することができ、文字列でDBからのコンテンツではなく、いくつかのDIYその場しのぎのものであり:

>>> import csv 
>>> from cStringIO import StringIO 
>>> fromDB = '"Column\nheading1",hdng2\r\n"data1\rfoo","data2\r\nfoo"\r\n' 
>>> sources = [StringIO(fromDB), fromDB.splitlines(True), 
...  fromDB.splitlines(), fromDB.split("\n")] 
>>> for i, source in enumerate(sources): 
...  print i, list(csv.reader(source)) 
... 
0 [['Column\nheading1', 'hdng2'], ['data1\rfoo', 'data2\r\nfoo']] # OK 
1 [['Column\nheading1', 'hdng2'], ['data1\rfoo', 'data2\r\nfoo']] # OK 
2 [['Columnheading1', 'hdng2'], ['data1foo', 'data2foo']]   # 3 errors 
3 [['Columnheading1', 'hdng2'], ['data1\rfoo', 'data2\rfoo'], []] # 3 errors 
>>> 

guff.splitlines(True)を使用していますあなたのコードを読んでいる人は、それが何をしているのかという手がかりを持たないだろうという理由で、それはStringIO(guff)よりはるかに大きなチャンスを持っているのでお勧めできません。

関連する問題