7

ファイル全体をメモリにフェッチしようとしています (完了 - StringIO を使用) - しかし、これらのオブジェクトは、私が見る限り「実際の」ファイルとまったく同じように動作しません - 内容全体を取得するか、または読み取ることができます一度に1行ずつですが、このパターンを適用する方法がわかりません:

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

メモリファイルをディスク上のファイルと同じように扱う方法はありますか?

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

編集:これについての回答に感謝します-私を混乱させていたものを絞り込んだと思います...しかし、ここにはまだ問題があります.次は何も出力しませんか? フラッシングが疑われますか?

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()

編集#2:しかし、私は間違ったツリーを吠えていると思います:これのオンディスクバージョンも動作させることができませんでした(「IOError:読み取り用にファイルが開かれていません」-すでに読み取りを呼び出すとファイルを開く...) 編集#3:StringIOを放棄しました(実際には必要ありません)-回答に従って分割線を使用しました。

コードとコメントをここに残しておきます - 役に立つ場合に備えて。(行き止まりですが)。

4

2 に答える 2

13

ファイル全体をメモリに読み込み、それがテキストの場合、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
于 2013-07-20T22:47:18.923 に答える
6

StringIOオブジェクトを開く必要はありません。すでに開いているファイル オブジェクトです。

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

必要なcsv.reader()のは反復可能なオブジェクトだけです。オブジェクトはその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']

あなた自身のStringIO.StringIOテストについては; ファイルオブジェクトに書き込みましたが、先頭に戻ることを怠っていました。ファイルポインタがまだ最後にあるため、データは読み取られません。シークバック:

memfile.seek(0)
spamreader=reader(memfile)
于 2013-07-20T22:42:21.967 に答える