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'))