Открыть файл с именем на кириллице на FTP через ftplib

Подключаюсь через ftplib к FTP-серверу. Там есть файлы, у которых наименование на кириллице. Если я наименования файлов заменю на test.csv, test2.csv (т.е. без кириллицы), то все работает. Ошибка возникает на строке ftp.retrbinary('RETR ' + filename, f.write).

Если не делать строку filename = file.encode('windows-1251').decode('utf-8'), то ошибка такая: Error downloading Факт Выручка_КА_202401-202401.csv: 550 Failed to open file.

Если делать, то ошибка такая: Error downloading Факт Выручка_КА_202401-202401.csv: 'utf-8' codec can't decode byte 0xd4 in position 0: invalid continuation byte

Как в итоге открыть файл на FTP с наименованием на кириллице, но внутренность которого на utf-8 и передать это дело в pandas?

from ftplib import FTP
import pandas as pd
from io import BytesIO

# FTP креды
ftp_hostname = '158.111.20.111'
ftp_username = 'user'
ftp_password = 't2JGC'

# Подключаемся к FTP
ftp = FTP(ftp_hostname)
ftp.login(user=ftp_username, passwd=ftp_password)

# Меняем кодировку, т.к. названия файлов содержат кириллицу
ftp.encoding='windows-1251' 

# Иду в нужную папку
ftp.cwd('userfiles')

# Беру только .csv файлы, начинающиеся с 'Факт Выручка'
data_files = [file for file in ftp.nlst() if file.endswith('.csv') and file.startswith('Факт Выручка')]

# Что возвращает переменная
# data_files = ['Факт Выручка_КА_202401-202401.csv', 'Факт Выручка_КА_202402-202402.csv']

# Возвращаю кодировку на utf-8
ftp.encoding='utf-8' 

content = []

for file in data_files:
    with BytesIO() as f:
        try:
            filename = file.encode('windows-1251').decode('utf-8')
            ftp.retrbinary('RETR ' + filename, f.write)
            f.seek(0)  # Move cursor to the beginning of the BytesIO buffer
            # Read the CSV file from the BytesIO buffer with ANSI encoding
            df = pd.read_csv(f,  index_col=None, header=0)
            df['FILE NAME'] = filename
            content.append(df)
        except Exception as e:
            print(f"Error downloading {file}: {e}")

ftp.quit()

frame = pd.concat(content, axis=0, ignore_index=True)

Ответы (0 шт):