Python 3 кодирует ошибку Google Translate API - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь перевести содержимое текстового файла, закодированного в 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 Ответ

0 голосов
/ 13 мая 2018

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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...