python ftplib encoding

Рейтинг: -1Ответов: 1Опубликовано: 29.06.2023

Не получается скопировать файл с FTP.

Рабочий код, пытаюсь сделать универсальным для разных ftp серверов:

import ftplib

kontr = parse_config(chain)

ftp = ftplib.FTP(kontr['ftp']['server']) 
ftp.login(kontr['ftp']['user'], kontr['ftp']['pwd'])
ftp.cwd(kontr['ftp']['path']['order'])
ftp.encoding = kontr['ftp']['encoding'] #windows-1251
ftp_files = ftp.nlst() #Без ftp.encoding будет падать на чтении

... # Сравнение локальной папки и ftp

if len(file_new) > 0:
    for file in file_new:
        with open(kontr['file']['order_in'] + file, 'wb') as local_file: # Создаем локальный файл в режиме двоичной записи
            ftp.retrbinary('retr ' + file, local_file.write)  # Открываем файл на сервере и делаем его копию в локальный файл
    ftp.close()
    read_file(chain, file_new) #Обработка скачанного файла
else:
    ftp.close()

ftp.file.encoding = utf-8 и доступно только для чтения

Падает на ftp.retrbinary('retr ' + file, local_file.write)
Ошибка: 'utf-8' codec can't decode byte 0xc0 in position 44: invalid start byte

Windows 10 Python 3.10.4

Traceback

Traceback (most recent call last):
  File "C:\Users\my_acc\Desktop\Test\Test.py", line 63, in check_new_file
    ftp.retrbinary('retr ' + file, local_file.write)
  File "C:\Users\my_acc\AppData\Local\Programs\Python\Python310\lib\ftplib.py", line 436, in retrbinary
    with self.transfercmd(cmd, rest) as conn:
  File "C:\Users\my_acc\AppData\Local\Programs\Python\Python310\lib\ftplib.py", line 393, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Users\my_acc\AppData\Local\Programs\Python\Python310\lib\ftplib.py", line 359, in ntransfercmd
    resp = self.sendcmd(cmd)
  File "C:\Users\my_acc\AppData\Local\Programs\Python\Python310\lib\ftplib.py", line 281, in sendcmd
    return self.getresp()
  File "C:\Users\my_acc\AppData\Local\Programs\Python\Python310\lib\ftplib.py", line 244, in getresp
    resp = self.getmultiline()
  File "C:\Users\my_acc\AppData\Local\Programs\Python\Python310\lib\ftplib.py", line 230, in getmultiline
    line = self.getline()
  File "C:\Users\my_acc\AppData\Local\Programs\Python\Python310\lib\ftplib.py", line 212, in getline
    line = self.file.readline(self.maxline + 1)
  File "C:\Users\my_acc\AppData\Local\Programs\Python\Python310\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 44: invalid start byte

Ответы

▲ 0

Спасибо @insolor в решении проблемы

Вкратце - кодировка устанавливается до авторизации. Чего я не заметил

На данном примере решение будет таким

ftp = ftplib.FTP(kontr['ftp']['server'], encoding=kontr['ftp']['encoding'])