Apache Beam 2.7.0 сбои в UTF-8 декодирования французских символов - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь записать CSV из корзины облачной платформы Google в хранилище данных, содержащее французские символы / акценты , но у меня появляется сообщение об ошибке, касающееся декодирования.

После попытки кодирования и декодирования из " latin-1 " в " utf-8 " без успеха (при использовании юникод, unicodedata и кодеков ) Я пытался что-то изменить вручную ...

Используемая мной ОС по умолчанию имеет кодировку " ascii ", и я вручную изменил в " Anaconda3 / envs / py27/lib/site.py "в utf-8.

def setencoding():
    """Set the string encoding used by the Unicode implementation.  The
    default is 'ascii', but if you're willing to experiment, you can
    change this."""
    encoding = "utf-8" # Default value set by _PyUnicode_Init()
    sys.setdefaultencoding("utf-8")

Я пробовал локально с тестовым файлом, печатая, а затем записывая строку с акцентами в файл, и это работало!

string='naïve café'
test_decode=codecs.utf_8_decode(string, "strict", True)[0]
print(test_decode)

with  open('./test.txt', 'w') as outfile:
    outfile.write(test_decode)

Но не повезло с apache_beam...

Затем я попытался вручную изменить " / usr / lib / python2.7 / encodings / utf_8.py " и поставить " ignore "вместо " строгого " в codecs.utf_8_decode

def decode(input, errors='ignore'):
    return codecs.utf_8_decode(input, errors, True)

но я понял, что apache_beam не использует этот файл или, по крайней мере, не учитывает его изменения

Есть идеи, как с этим бороться?

Ниже вы найдете сообщение об ошибке

Traceback (most recent call last):
  File "etablissementsFiness.py", line 146, in <module>
    dataflow(run_locally)
  File "etablissementsFiness.py", line 140, in dataflow
    | 'Write entities into Datastore' >> WriteToDatastore(PROJECT)
  File "C:\Users\Georges\Anaconda3\envs\py27\lib\site-packages\apache_beam\pipel
ine.py", line 414, in __exit__
    self.run().wait_until_finish()
  File "C:\Users\Georges\Anaconda3\envs\py27\lib\site-packages\apache_beam\runne
rs\dataflow\dataflow_runner.py", line 1148, in wait_until_finish
    (self.state, getattr(self._runner, 'last_error_msg', None)), self)
apache_beam.runners.dataflow.dataflow_runner.DataflowRuntimeException: Dataflow
pipeline failed. State: FAILED, Error:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/dataflow_worker/batchworker.py",
line 642, in do_work
    work_executor.execute()
  File "/usr/local/lib/python2.7/dist-packages/dataflow_worker/executor.py", lin
e 156, in execute
    op.start()
  File "dataflow_worker/native_operations.py", line 38, in dataflow_worker.nativ
e_operations.NativeReadOperation.start
    def start(self):
  File "dataflow_worker/native_operations.py", line 39, in dataflow_worker.nativ
e_operations.NativeReadOperation.start
    with self.scoped_start_state:
  File "dataflow_worker/native_operations.py", line 44, in dataflow_worker.nativ
e_operations.NativeReadOperation.start
    with self.spec.source.reader() as reader:
  File "dataflow_worker/native_operations.py", line 48, in dataflow_worker.nativ
e_operations.NativeReadOperation.start
    for value in reader:
  File "/usr/local/lib/python2.7/dist-packages/apache_beam/io/textio.py", line 2
01, in read_records
    yield self._coder.decode(record)
  File "/usr/local/lib/python2.7/dist-packages/apache_beam/coders/coders.py", li
ne 307, in decode
    return value.decode('utf-8')
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 190: invalid continuation byte

1 Ответ

0 голосов
/ 24 апреля 2019

Эта ошибка: «UnicodeDecodeError: кодек« utf8 »не может декодировать байт» означает, что ваш CSV-файл все еще содержит некоторые неправильные байты, не распознаваемые декодером как символы UTF.

Самым простым решением для этого является преобразование и проверка входного файла csv на наличие ошибок UTF8 перед отправкой в ​​хранилище данных. Простая онлайн проверка UTF8 может проверить это .

Если вам нужно преобразовать латиницу-1 в UTF8 в python, вы можете сделать это так:

string.decode('iso-8859-1').encode('utf8')
...