我正在尝试将输出写入Python 3.4中的CSV文件,但CSV文件始终包含“b”标志。例如,b'文本输出1',b'文本输出2',...我想知道是否有办法摆脱'b'标志。我知道这不是Python 2.X中的问题。
以下是我使用的代码
with open('test.csv', 'w') as f:
writer = csv.DictWriter(f, ['field'], extrasaction='ignore')
writer.writeheader()
test_text = mongo.test.find({'text': text})
for t in test_text
writer.writerow({i:v.encode('utf') for i,v in t.items()})
非常感谢
------更新-----------
非常感谢Tim Pietzcker,John Zwinck和Warren Weckesser提供的有用评论和答案。根据Warren的建议,如果我将代码更改为
import csv
data = [chr(0x03d5) + 'oo', 'b' + chr(0x0101) + 'r']
with open('test.csv', 'w') as f:
writer = csv.writer(f)
for item in data:
writer.writerow([item])
我会收到错误消息
UnicodeEncodeError: 'charmap' codec can't encode character '\u03d5' in position 0: character maps to <undefined>
如果我将代码更改为
import csv
data = [chr(0x03d5) + 'oo', 'b' + chr(0x0101) + 'r']
with open('test.csv', 'w') as f:
writer = csv.writer(f)
for item in data:
writer.writerow([item.encode('utf')])
我将获得带有'b'标志的输出
b'\xcf\x95oo'
b'b\xc4\x81r'
有关如何发生这种情况的想法以及我如何解决这个问题?再次感谢。
------更新2 -----------
非常感谢沃伦的解决方案。以下代码有效!
import csv
data = [chr(0x03d5) + 'oo', 'b' + chr(0x0101) + 'r']
with open('test.csv', 'w', encoding='utf8') as f:
writer = csv.writer(f)
for item in data:
writer.writerow([item])
答案 0 :(得分:4)
不要自己对字符串进行显式编码;让作者照顾它。例如,此代码:
import csv
data = [chr(0x03d5) + 'oo', 'b' + chr(0x0101) + 'r']
with open('test.csv', 'w') as f:
writer = csv.writer(f)
for item in data:
writer.writerow([item])
写入文件
ϕoo
bār
使用UTF-8编码(至少在我的系统上,locale.getpreferredencoding(False)
返回'UTF-8'
)。要使编码显式,您可以在调用open
:
with open('test.csv', 'w', encoding='utf8') as f:
如果最后一行更改为writer.writerow([item.encode('utf')])
(将字符串转换为bytes
),则会生成
b'\xcf\x95oo'
b'b\xc4\x81r'
在您的示例中,请尝试更改此行:
writer.writerow({i:v.encode('utf') for i,v in t.items()})
到此:
writer.writerow(t)
然后,如果可行,您可以替换它:
for t in test_text
writer.writerow({i:v.encode('utf') for i,v in t.items()})
与
writer.writerows(test_text)