Python — как исключить ошибку UnicodeEncodeError при скачивании CSV на сервере Ubuntu?

Я делаю небольшое Django приложение, которое скачивает данные из разных источников.

У меня есть код, который работает корректно на Python 3.9 Windows 10 (а также работает в CloudFunctions на разных площадках):
SCOPES = ['https://www.googleapis.com/auth/drive']
    credentials = service_account.Credentials.from_service_account_file('Files/google_credentials.json', scopes=SCOPES)
    service = build('drive', 'v3', credentials=credentials)
    file_id = '1xw_farCB9iwCol2j9uvRoniB7ECdFz9kca'
    request = service.files().export_media(fileId=file_id, mimeType='text/csv')
    filename = 'Files/Реестр CERT.csv'
    fh = open(filename, 'wb')
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()


Однако, при запуске его на сервере Ubuntu 18, Python3.6.9 я получаю следующую ошибку:
Строка: fh = open(filename, 'wb')
Название ошибки: UnicodeEncodeError
Описание ошибки: 'ascii' codec can't encode characters in position 48-53: ordinal not in range(128)

Что уже успел попробовать из того, что поддается логике:
1. Использовать вместо open() - io.FileIO()
2. Изменил кодировку в настройке Ubuntu:
sudo locale-gen en_US en_US.UTF-8
sudo dpkg-reconfigure locales
  • Вопрос задан
  • 171 просмотр
Решения вопроса 1
MrAskar96
@MrAskar96 Автор вопроса
Игорь Маркин, Александр Карабанов большое спасибо за участие в вопросе!

Решение найдено. Все это время оно лежало на поверхности.

В итоге, python ругался на русские символы в коде (название файла). Дело в том, что в рекомендованном коде Google используется следующий алгоритм: создается пустой csv файл -> в него записываются данные с файла csv Google Drive. Пустой файл как раз создается на шаге open('.csv') или io.FileIO('.csv'). Исключение русских символов при создании нового файла позволило избежать ошибку.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
karabanov
@karabanov
Системный администратор
Накати Python 3.9 с помощью pyenv (не забудь установить библиотеки).

Что бы установить pyenv curl https://pyenv.run | bash
Установить Python pyenv install 3.9.9
Создай virualenv и работай в нём, чтобы не сломать систему.

И есть беспройгрышный вариант - запускать Python в Docker.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы