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

时间:2014-10-07 05:09:26

标签: python csv

我正在尝试将输出写入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])

1 个答案:

答案 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)