2013-07-20 7 views
5

ファイル全体をメモリに取り込もうとしていますが(StringIOを使ってdoneを実行しました)、これらのオブジェクトは実際には実際のファイルとまったく同じように振る舞いません - 私は全体の内容を取得します。一度にラインを読んで、私はこのパターンを適用する方法を考え出すことはできません。CSVリーダーにメモリファイルを読み込ませるには?

import csv 
with open(#MYMEMORYFILE_HERE#, 'rb') as csvfile: 
     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
     for row in spamreader: 

だけで、ディスク上のファイルのようにmemoryfileを治療する方法はありますので、私はよりよいイディオムを使用することができます上記?

Python 2.7.4 (default, Apr 19 2013, 18:28:01) 

EDIT:これについて答えてくれてありがとう - 私は私が私を混乱させたものを絞り込んたと思う...しかし、私はまだここに問題があり、次は何も出力しないのですか?私は洗い出しを疑う?

from csv import reader, writer 
import StringIO 

memfile=StringIO.StringIO() 
spamwriter = writer(memfile) 
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans']) 
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) 
spamreader=reader(memfile) 
for row in spamreader: 
     print ', '.join(row) 
memfile.close() 

EDIT#2:しかし、私は、私が思う間違っツリーまで吠えている:私はこれのディスク上のバージョンがどちらかの仕事を得ることができませんでしたが(「例外IOError:読取り用に開かれていないファイル」 - とき EDIT#3:StringIOを放棄しました(本当に必要ありません) - 答えごとに分割線を使用しました。

ここにコードとコメントを残しておきます(便利な場合に備えて)。 (たとえそれが袋小路であっても)。

spamreader = csv.reader(MYMEMORYFILE_HERE, delimiter=' ', quotechar='|') 

すべてのことcsv.reader()ニーズ反復可能なオブジェクトである:StringIOオブジェクトをオープンする必要はありません

+0

年後、私はあなたの質問を更新しました。あなたが* 0を求めることを忘れたので更新が失敗します。 –

答えて

9

ファイル全体をメモリに読み込み、そのテキストをテキストにする場合は、StringIOオブジェクトを開く必要はありません。それを文字列として読んでください!

with open(filename, 'r') as file: 
    in_memory_file = file.read() 

その後、あなたはそれの上にあなたが開いているテキストファイルを反復処理するような方法を反復するsplitlinesを使用することができます。

spamreader = csv.reader(in_memory_file.splitlines(), delimiter=' ', quotechar='|') 
for row in spamreader: 
    pass 
+0

実際、これは私がかなりうまくやっていることに合っています(私は最初にディスク上のファイルを読み込み、メモリ上のファイルにコピーしています)。 – monojohnny

+0

私はread() - > readlines() - >私はsplitlinesについてのすべてを忘れていた>開かれたイディオムを使用して行って以来、大変 - あまりにも長いStringIOは残虐でした!乾杯 – monojohnny

4

は、それが開かれたファイルオブジェクトがすでにです。 StringIOオブジェクトはその要件に適合します。

デモ:あなた自身のStringIO.StringIOテスト用として

>>> from StringIO import StringIO 
>>> data = StringIO('1,2,3\n4,5,6\n') 
>>> import csv 
>>> for row in csv.reader(data): 
...  print row 
... 
['1', '2', '3'] 
['4', '5', '6'] 

。あなたはファイルオブジェクトに書きましたが、始めに戻ってくるのを忘れました。ファイルポインタがまだ終わっているので、データは読み込まれません。後ろに探す:

memfile.seek(0) 
spamreader=reader(memfile) 
関連する問題