@Gys

Как записать кириллицу в название файла aiofiles?

Есть функция
async def init_csv(channel):
    fieldnames = ["channel_id", "channel_name", "title", "description", "preview_image", "video", "category", "created_at"]
    async with aiofiles.open(f'csv/result-{channel.channel_name}.csv', encoding='utf-8', mode='w') as file:
        writer = aiocsv.AsyncDictWriter(file, fieldnames, delimiter=';')
        await writer.writeheader()

channel_name - строка. Она иногда в себе содержит кириллицу.
На windows работает нормально, файл создается.
На linux выдает ошибку:
latin-1 codec cant encode characters in position 11-15: ordinal not in range(256)

Установил переменную окружения PYTHONIOENCODING=utf-8, но это не помогло.
Собственно, как это исправить?
  • Вопрос задан
  • 162 просмотра
Пригласить эксперта
Ответы на вопрос 1
shpaker
@shpaker
Вольный хлебопашец
Добро пожаловать в клуб любителей юникода. Видимо где-то у вас кроме кириллицы забралась в строки какая-то невалидщина.

Для open есть аргумент errors, который задает поведение функции при ошибках чтения строк. Можно попробовать ignore или replace, но не ясно как оно поведет на чтении файлов. Пробовать надо :)

'strict' to raise a ValueError exception if there is an encoding error. The default value of None has the same effect.

'ignore' ignores errors. Note that ignoring encoding errors can lead to data loss.

'replace' causes a replacement marker (such as '?') to be inserted where there is malformed data.

'surrogateescape' will represent any incorrect bytes as low surrogate code units ranging from U+DC80 to U+DCFF. These surrogate code units will then be turned back into the same bytes when the surrogateescape error handler is used when writing data. This is useful for processing files in an unknown encoding.

'xmlcharrefreplace' is only supported when writing to a file. Characters not supported by the encoding are replaced with the appropriate XML character reference &#nnn;.

'backslashreplace' replaces malformed data by Python’s backslashed escape sequences.

'namereplace' (also only supported when writing) replaces unsupported characters with \N{...} escape sequences.


https://docs.python.org/3/library/functions.html#open
Ответ написан
Ваш ответ на вопрос

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

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