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

我在那里使用了模块的 C 变体StringIO;优点是速度,缺点是您只能将每个实例用作可写可读文件。由于您所做的只是在检索写入的数据之前对其进行写入,这很好。

于 2012-09-01T14:50:34.597 回答
5

StringIO只要您需要类似文件的对象(使用write方法)并且不想在文件系统中创建实际文件,您就可以随时使用。

这种内存文件方法的一个优点是 I/O 比使用真正的存储后端快得多。如果你想更快,你可以使用cStringIO. 请注意,这cStringIO并不总是可用,因此您可以执行类似的操作

try:
    import cStringIO as StringIO
except ImportError:
    import StringIO
于 2012-09-01T14:50:39.917 回答
3

Python 3.x 和 2.6+

cStringIO如其他答案中所述,已在 Python 3 中删除。

而是像这样使用io.StringIO

import csv
import io

mem_file = io.StringIO()
writer = csv.writer(mem_file)

writer.writerow(['your', 'data', 'here'])

print(mem_file.getvalue())

你的数据在这里

于 2019-09-23T15:24:24.477 回答