Открыть файл с именем на кириллице на 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)