Airflow работник не понимает кодировку файла при разборе файла с пандами - PullRequest
0 голосов
/ 25 сентября 2018

Со следующим кодом:

import pandas as pd

    filename = r"/path/to/my/file.csv"

    with open(filename) as f:
        data_frame = pd.read_csv(f,
                            usecols=['col1', 'col2'],
                            parse_dates=['DateProd', 'DateStart', 'DateEnd'],
                            header=0,
                            delimiter=';',
                            encoding='latin-1')
        print(data_frame)

Когда это выполняется локально, он печатает ожидаемый кадр данных с надлежащим акцентуацией.При выполнении в задаче воздушного потока на удаленном работнике происходит сбой со следующей ошибкой:

UnicodeDecodeError: кодек «utf-8» не может декодировать байт 0xe9 в позиции 2581: недопустимый байт продолжения

При просмотре полной трассировки отладочной цепочки (извините, конфиденциальная информация не может быть полностью предоставлена), я вижу в трассировке стека, что определенно задано encoding = 'latin-1', и он все еще не работаетс ошибкой UnicodeDecodeError.Кто-нибудь заметил подобную проблему?Я бегал кругами, пытаясь использовать как можно больше кодировок, но, похоже, ничего не работает.

Я забыл упомянуть, что этот файл является удаленным файлом на общем ресурсе samba.Я пытаюсь прочитать его напрямую с помощью smbclient.open () или скопировать его локально, а затем открываю, получаю тот же результат: UnicodeDecodeError.Когда я пытаюсь сделать то же самое локально (и читая напрямую из общего ресурса samba, или копируя его), все выглядит нормально, и я заметил, что мне даже не нужно указывать кодировку, он найдет ее автоматически, и ударения будутотображается правильно.

Еще одно обновление: кажется, что файл читается из общей папки samba или нет, не имеет значения.Мне удалось запустить образ докера, который используется на удаленном работнике, и я могу воспроизвести эту проблему со всем, что размещено локально, когда я открываю файл раньше, когда я полностью читаю его перед тем, как передать его пандам, или просто я даюимя файла для read_csv.

Кажется, что движок не имеет значения: указание engine = 'python' или engine = 'c' дает те же результаты.

Другое обновление: похоже, чтота же самая проблема также происходит со свежим образом докера Ubuntu.Я предполагаю, что есть некоторые локали, которые нужно установить, прежде чем они смогут их проанализировать.

1 Ответ

0 голосов
/ 26 сентября 2018

Я понял это.

На компьютере с Windows кодировка по умолчанию выглядит иначе.Мне даже не нужно указывать кодировку для его работы.Не в контейнере.Таким образом, мне нужно указать кодировку при открытии файлов в контейнерах.Должно работать следующее:

import pandas as pd

filename = r"/path/to/my/file.csv"

with open(filename, encoding='latin-1') as f:
    data_frame = pd.read_csv(f,
                        usecols=['col1', 'col2'],
                        parse_dates=['DateProd', 'DateStart', 'DateEnd'],
                        header=0,
                        delimiter=';',)
                        # Notice the lack of encoding='latin-1' here.
    print(data_frame)

Но!SambaHook, по сути, возвращает SambaClient для клиента.Когда вы пытаетесь открыть файл с этим Sambaclient, нет способа указать кодировку файла.Итак, локально на машине с Windows все работает нормально.В контейнере linux происходит сбой с UnicodeDecodeError.Заглянув внутрь, я обнаружил, что он по сути копирует файл перед простым вызовом open () для этого файла.

На данный момент это мое решение: скопируйте файл с SambaClient, возвращенным SambaHookво временном файле откройте его с правильной кодировкой, попросите panda разобрать его.Я посмотрю, что можно сделать для улучшения SambaHook и pysmbclient, чтобы другие могли указать кодировку при открытии файла.

...