Python 3 DictWriter csv BytesIO 类型错误

6 投票
1 回答
4896 浏览
提问于 2025-04-18 14:50

我在用Python 3生成一个CSV文件。为了确保我写入的是UTF-8格式,所以我把字典列表中的值转换成了字节字符串。

field_order = ['field1', 'field2', 'field3', 'field4']
stats = ... # list of dicts
output = io.BytesIO()
writer = csv.DictWriter(output, field_order)
writer.writeheader()
for stats in my_stats:
    writer.writerow({k: bytes(v, 'utf8') for k, v in stats.items()})
    csv_output = output.getvalue()

但是在调用writer.writeheader()的时候,我遇到了一个异常。

TypeError: 'str' does not support the buffer interface

看起来没有办法让writerheader写入字节数据。我到底哪里做错了呢?

1 个回答

11

csv模块是用来处理字符串的,具体内容可以参考官方文档

写入对象(比如DictWriter实例和通过writer()函数返回的对象)有一些公开的方法。对于写入对象来说,一行数据必须是字符串或数字的序列;而对于DictWriter对象来说,一行数据则需要是一个字典,这个字典把字段名映射到字符串或数字(在传入之前需要先用str()转换一下)。需要注意的是,复数会用括号括起来写出来。这可能会给其他读取CSV文件的程序带来一些问题(假设它们支持复数的话)。

可以考虑使用io.StringIO,然后再把它编码成utf-8格式。

import csv
import io

field_order = ['field1', 'field2', 'field3', 'field4']
my_stats = ...
output = io.StringIO()
writer = csv.DictWriter(output, field_order)
writer.writeheader()
for stats in my_stats:
    writer.writerow(stats)
csv_output = output.getvalue().encode('utf-8')

撰写回答