Как кодировать при записи в файл? - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь записать некоторые данные в файл.В некоторых случаях, очевидно, в зависимости от данных, которые я пытаюсь записать, я получаю UnicodeEncodeError (UnicodeEncodeError: кодек 'charmap' не может закодировать символ '\ U0001f622' в позиции 141: символ сопоставляется с) Я провел некоторое исследование и выяснил,что я могу кодировать данные, которые я пишу, с помощью функции кодирования.

Это код перед его изменением (не поддерживающий 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, найдены байты

Я также попытался открыть файл в байтовом режимес добавлением AB за W.Однако это не дало никаких результатов.

Кто-нибудь знает, как это исправить?Кстати: я использую Python 3.

1 Ответ

1 голос
/ 27 марта 2019

Вы уже открыли файл с автоматическим кодированием. Нет необходимости вручную что-либо кодировать, если вы не пишете в двоичный файл.
Вы можете указать любую поддерживаемую кодировку в 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))
...