@Dato38it

Как скачать несколько файлов из FTP-сервера через Python?

Мне нужно скопировать несколько файлов из FTP-сервера в локальную папку.

Как это реализовать на Python?

В дальнейшем я буду копировать файлы в сетевую папку и добавлять скопированные файлы в архив, но пока тренируюсь просто копировать файл в локальную папку без добавления в архив.

Вот как я пытаюсь сделать:
from ftplib import FTP
import os
ftp = FTP("tipftp")
ftp.login(user="tuserftp", passwd="tpssword")
local_file = '/Users/tuser/Documents/py/test/testfile.txt'
#files = ftp.nlst('/Backups/tdir/*.xml')
files = ftp.nlst('/Backups/tdir/MRBTS881364.xml')
#print(files)
for file in files:
    #print(file)
    file_list=[]
    file_list.append(file)
    file_list1=str(file_list)
    print(file_list1)
    with open(local_file, 'wb') as tempfile:
        #print("Работа с файлом testfile")
        ftp.retrbinary('RETR' + file_list1, tempfile.write)
        #ftp.retrbinary('retr ' + str(files), tempfile.write)
ftp.quit()
#source:
# https://sky.pro/media/rabota-s-fajlami-v-python-kak-poluchit-spisok-vseh-fajlov-v-direktorii/
# https://docs.python.org/3/library/ftplib.html
# https://sky.pro/media/kak-ispolzovat-python-dlya-raboty-s-ftp/
# https://pythonworld.ru/tipy-dannyx-v-python/spiski-list-funkcii-i-metody-spiskov.html
# https://dvmn.org/encyclopedia/python_intermediate/python_lists/
# https://metanit.com/python/tutorial/4.1.php
# https://lavrynenko.com/python-ftplib-skachat-fajl/

Здесь сначала пытаюсь скопировать все файлы /Backups/tdir/*.xml, добавляя в список. потом я попробовал хотя бы один файл из данной папки MRBTS881364.xml скачать.
Выходит следующая ошибка:
PS C:\Users\tuser\Documents\py> python .\tpy.py
['/Backups/tdir/MRBTS881364.xml']
Traceback (most recent call last):
  File "C:\Users\tuser\Documents\py\tpy.py", line 13, in <module>
    ftp.retrbinary('RETR %s' %file_list1, tempfile.write)
  File "C:\Program Files\Python310\lib\ftplib.py", line 436, in retrbinary
    with self.transfercmd(cmd, rest) as conn:
  File "C:\Program Files\Python310\lib\ftplib.py", line 393, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Program Files\Python310\lib\ftplib.py", line 359, in ntransfercmd
    resp = self.sendcmd(cmd)
  File "C:\Program Files\Python310\lib\ftplib.py", line 281, in sendcmd
    return self.getresp()
  File "C:\Program Files\Python310\lib\ftplib.py", line 254, in getresp
    raise error_perm(resp)
ftplib.error_perm: 550 Failed to open file.


/Backups/tdir/ это папка, из которой мне нужно скачать файлы формата XML.

Как мне это сделать?
  • Вопрос задан
  • 198 просмотров
Решения вопроса 1
grantur5707
@grantur5707
Full Stack Web Developer
from ftplib import FTP
import os

ftp = FTP("tipftp")
ftp.login(user="tuserftp", passwd="tpssword")

local_dir = '/Users/tuser/Documents/py/test/'
files = ftp.nlst('/Backups/tdir/')
xml_files = [file for file in files if file.endswith('.xml')]

for file in xml_files:
    local_file = os.path.join(local_dir, os.path.basename(file))
    with open(local_file, 'wb') as tempfile:
        ftp.retrbinary(f'RETR {file}', tempfile.write)

ftp.quit()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
Как всегда, полное непонимание того что ты делаешь, какой же это треш на список делать str, зачем на каждой итерации повторять это, потом эту кривость совать как аргумент для скачивания.

file_list.append(file)
зачем?

file_list1=str(file_list)
вот самый треш

ftp.retrbinary('RETR' + file_list1, tempfile.write)
зачем ты сюда это треш стал совать

#ftp.retrbinary('retr ' + str(files), tempfile.write)
еще раз намекает, что ты программируешь метод тыка, не понимая что ты делаешь.

А теперь главный вопрос, что тебе мешало просто делать ftp.retrbinary('RETR ' + file, tempfile.write)

ЗЫ ну и сразу FTP это уставший протокол, забудь про него, твоя задача элементарно решается через rsync и подобные инструмент, а не этими кривыми костылями
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы