删除CSV输出中的'b'标志

问题描述:

我试图在Python 3.4中将输出写入CSV文件,但CSV文件始终包含'b'标志。例如,b'The text output1',b'The text output2',...我想知道是否有办法摆脱'b'标志。我明白这不是Python 2.X中的问题。删除CSV输出中的'b'标志

下面是我用

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提供了有用的评论和答案。每沃伦的建议,如果我改变我的代码,以

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

如果我改变我的代码,以

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”输出我会得到错误信息

UnicodeEncodeError: 'charmap' codec can't encode character '\u03d5' in position 0: character maps to <undefined> 

标记

b'\xcf\x95oo' 
b'b\xc4\x81r' 

任何thoug hts如何发生这种情况,以及我可以如何解决它?再次感谢。

------更新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

这个代码在语法上不合法,将不能运行。 – 2014-10-07 05:11:55

+1

如果您将代码缩减为独立运行并显示问题的代码,将会有所帮助。你发布的代码有一些额外的东西,从真正的问题分心。 – 2014-10-07 05:12:24

+0

感谢您的意见。根据沃伦的评论,我已经更新了我的帖子和代码,但问题似乎仍然存在。 – frostman 2014-10-07 16:22:02

不要自己显式编码字符串;让作家照顾它。例如,这样的代码:

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) 
+0

谢谢你的回答。我已根据您的答案更新了我的帖子和代码,但问题似乎仍然存在。 – frostman 2014-10-07 16:22:35