8

csv.writer を使用して、ファイルではなく変数にデータを書き込むことは可能ですか?

私はこのようなことができることを望んでいました:

data = ''
csv.writer(data)
# ...... (I have removed the csv processing code for brevity)
message = EmailMessage('Invoice for 2012', 'h', 'noreply@test.co.uk', ['test@test.co.uk'])
message.attach('invoice.csv', data, 'text/csv')
message.send()

コードを実行すると、次のエラーが発生します。

   argument 1 must have a "write" method
4

3 に答える 3

13

csv.writerクラスには、ファイルのようなオブジェクト、つまりメソッドを備えたものが必要です.write()。ここではStringIOクラスが最適です。

from cStringIO import StringIO

data = StringIO()
csv.writer(data)
# write your stuff
message = EmailMessage('Invoice for 2012', 'h', 'noreply@test.co.uk', ['test@test.co.uk'])
message.attach('invoice.csv', data.getvalue(), 'text/csv')
message.send()

StringIO私はそこでモジュールの C バリアントを使用しました。利点は速度です。欠点は、各インスタンスを書き込み可能ファイルまたは読み取り可能ファイルとしてのみ使用できることです。書き込まれたデータを取得する前に書き込むだけなので、それで問題ありません。

于 2012-09-01T14:50:34.597 に答える
5

StringIOファイルのようなオブジェクト (writeメソッドを使用) が必要で、ファイルシステムに実際のファイルを作成したくない場合はいつでも使用できます。

このメモリ ファイルアプローチの利点は、I/O が実際のストレージ バックエンドよりもはるかに高速であることです。さらに速くしたい場合は、 を使用できますcStringIOcStringIO常に利用できるとは限らないことに注意してください。

try:
    import cStringIO as StringIO
except ImportError:
    import StringIO
于 2012-09-01T14:50:39.917 に答える