【发布时间】:2016-12-04 01:28:14
【问题描述】:
在迁移到 Python 3 时,我注意到我们使用内置 csv 生成的一些文件现在每个字符串周围都有 b' 前缀...
这里的代码应该根据export_fields 定义的一些参数为dogs 列表生成一个.csv(因此总是返回unicode 数据):
file_content = StringIO()
csv_writer = csv.writer(
file_content, delimiter='\t', quotechar='"', quoting=csv.QUOTE_MINIMAL
)
csv_writer.writerow([
header_name.encode('cp1252') for _v, header_name in export_fields
])
# Write content
for dog in dogs:
csv_writer.writerow([
get_value(dog).encode('cp1252') for get_value, _header in export_fields
])
问题是一旦我返回file_content.getvalue(),我得到:
b'Does he bark?' b'Full Name' b'Gender'
b'Sometimes, yes' b'Woofy the dog' b'Male'
而不是 (缩进已被修改为在 SO 上可读):
'Does he bark?' 'Full Name' 'Gender'
'Sometimes, yes' 'Woofy the dog' 'Male'
我在csv 模块中没有找到任何encoding 参数。我希望整个文件在 cp1252 中编码,所以我并不关心编码是通过行的迭代完成还是在文件本身上进行。
那么,有谁知道如何生成一个正确的字符串,只包含 cp1252 编码的字符串?
【问题讨论】:
-
你为什么要编码?打开的文件对象负责处理。
-
@MartijnPieters 也许我的问题不完整:我想通过 Django 返回字符串:
return HttpResponse(generate_csv_file())。我应该在 Django 级别处理编码吗? -
看我的回答;你在错误的水平上接近这个;制表符和引号字符也需要编码,但这是 I/O 级别的工作,而不是
csv模块或生成行的代码。
标签: python python-3.x csv encoding stringio