Python 3 кодирует ошибку Google Translate API

Я пытаюсь перевести содержимое текстового файла, закодированного в UTF16-BE, с помощью Google Translate API, как описано на этом сайте: https://ctrlq.org/code/19909-google-translate-api. Я хочу, чтобы выходной файл был в той же кодировке.

Вот несколько фрагментов из моего кода:

...

import json
import urllib
from urllib.request import Request, urlopen
import urllib.parse

...

def googletranslate(sourceLang, targetLang, sourceText):
    url = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=" + 
    sourceLang + "&tl=" + targetLang + "&dt=t&q=" + 
    urllib.parse.quote_plus(sourceText)

    urld = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
    jsonfile = urlopen(urld).read()
    h = json.loads(jsonfile)
    return h[0][0][0]

...

input = [line.rstrip('\n') for line in open('input.txt', 'r', encoding="utf_16_be")]
output = open('output.txt', 'w', encoding="utf_16_be")

...

for y in range(offset,offset+size):
    text = input[y]
    text = googletranslate('auto', '<desired language>', text)
    text.encode('utf_16_be')
    print("T: " + text)
    output.write(text + '\n')

...

Тем не менее, когда я пытаюсь запустить это, это работает для большинства строк, но в итоге я получу ошибку, подобную этой:

T: <translated text>
Traceback (most recent call last):
  File "C:\PATH\TO\translate.py", line 124, in googletranslate
    output.write(text + '\n')
  File "C:\PATH\TO\AppData\Local\Programs\Python\Python36-32\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u0259' in position 22: character maps to <undefined>

Что я могу сделать, чтобы предотвратить эту ошибку? Кажется, печатать нормально в командной строке. Это только дает мне ошибку при попытке записи в выходной файл. Должен ли я выбрать другую кодировку? Разве UTF16-BE недостаточно для текста, переведенного Google?

Заранее спасибо!

1 ответ

Решение

Python пытается кодировать текст как cp1252 (стандартная кодировка Windows) при записи в выходной файл. Это произошло бы, если бы параметр кодирования не был передан open функция - возможно ли, что это так в вашем реальном коде, но не в вашем примере?

Есть два возможных решения.

Передать encoding параметр для openи установите режим как 'w', как вы, кажется, делаете в примере кода, и передать str к файлу write метод.

with open('output.txt', 'w', encoding="utf_16_be") as f:
    f.write(text)

Откройте файл в 'wb' режим без параметра кодирования и записи закодированных байтов в файл.

with open('output.txt', 'wb') as f:
    f.write(text.encode('utf_16_be'))
Другие вопросы по тегам