写入文件时如何编码?

时间:2019-03-27 19:40:32

标签: python unicode encoding

我正在尝试将一些数据写入文件。在某些情况下,显然取决于我尝试写入的数据,我得到UnicodeEncodeError(UnicodeEncodeError:'charmap'编解码器无法对位置141处的字符'\ U0001f622'进行编码:字符映射到) 我做了一些研究,发现我可以使用编码功能对正在编写的数据进行编码。

这是修改它之前的代码(不支持Unicode):

    scriptDir = os.path.dirname(__file__)
    path = os.path.join(scriptDir, filename)
    with open(path, 'w') as fp:
        for sentence in iobTriplets:
            fp.write("\n".join("{} {} {}".format(triplet[0],triplet[1],triplet[2]) for triplet in sentence))
            fp.write("\n")
            fp.write("\n")

所以我也许可以像这样写时添加编码:

fp.write("\n".join("{} {} {}".format(triplet[0],triplet[1],triplet[2]).encode('utf8') for triplet in sentence))

但是这不起作用,因为我收到以下错误: TypeError:序列项0:预期的str实例,找到的字节

我还尝试在字节模式下打开文件,并在w后面添加b。但这并没有产生任何结果。

有人知道如何解决此问题吗? 顺便说一句:我正在使用python 3。

1 个答案:

答案 0 :(得分:1)

您已经使用自动编码打开了文件。除非您要编写二进制文件,否则无需手动编码任何内容。
您可以在open()中指定任何受支持的编码:

 with open(path, 'w', encoding='utf-16be') as fp:

除非以二进制文件形式打开文件,否则需要删除str.encode()中的fp.write()

fp.write("\n".join("{} {} {}".format(triplet[0],triplet[1],triplet[2]) for triplet in sentence))