Python 3:不带b'的字符串

时间:2018-09-12 09:55:46

标签: string python-3.x csv

我很困惑。 talk解释说,您应仅在代码中使用unicode字符串。当字符串离开代码时,应将其转换为字节。我是为一个csv文件这样做的:

import csv

with open('keywords.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, delimiter='\t', quotechar='\"')
    for (p, keywords) in ml_data:
        writer.writerow([p.encode("utf-8"), ', '.join(keywords).encode("utf-8")])

这会导致令人讨厌的效果,在每个字符串的前面都添加了b',这在python 2.7中并没有发生。如果在将字符串写入csv文件之前不对字符串进行编码,则b'不存在,但是持久化时我不需要将它们转换为字节吗?如何在没有这种b'烦恼的情况下将字节写入文件?

1 个答案:

答案 0 :(得分:1)

停止尝试对单个字符串进行编码,而应为整个文件指定编码:

import csv

with open('keywords.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile, delimiter='\t', quotechar='\"')
    for (p, keywords) in ml_data:
        writer.writerow([p, ', '.join(keywords)])

您的代码出错的原因是,writerow希望您给它提供字符串,但是您正在传递字节,因此它使用了字节中的repr(),其中有额外的b'...'周围。如果您传递字符串,但是在打开文件时使用encoding参数,则字符串将为您正确编码。

请参见csv documentation examples。其中之一显示了如何设置编码。