Как с помощью Python скачать несколько файлов с FTP-сервера?

Как можно скопировать несколько файлов с FTP-сервера в локальную папку с использованием Python? В будущем я планирую копировать файлы в сетевую папку и архивировать их, но на данный момент хочу просто научиться копировать файлы в локальную папку без архивирования. Вот что я уже попробовал:

<pre><code class="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/</code></pre>

Я сначала пытался скопировать все файлы из директории /Backups/tdir/*.xml, добавляя их в список, а затем попытался загрузить хотя бы один файл, MRBTS881364.xml. Однако возникла следующая ошибка: 

<pre><code class="bash">PS C:\User
  • 20 сентября 2024 г. 3:03
Ответы на вопрос 2
Для скачивания нескольких файлов с FTP-сервера с использованием Python и библиотеки `ftplib`, вы можете следовать следующему примеру. Я исправлю ваш код, чтобы он мог загружать все XML-файлы из определенной директории на FTP-сервере и сохранять их в локальной папке. 

Вот пример кода:

```python
from ftplib import FTP
import os

# Параметры подключения к FTP-серверу
ftp_server = "tipftp"  # Замените на адрес вашего FTP-сервера
username = "tuserftp"
password = "tpssword"
remote_dir = '/Backups/tdir/'  # Директория на FTP-сервере
local_dir = '/Users/tuser/Documents/py/test/'  # Локальная директория для сохранения файлов

# Подключение к FTP-серверу
ftp = FTP(ftp_server)
ftp.login(user=username, passwd=password)

# Убедитесь, что локальная директория существует
os.makedirs(local_dir, exist_ok=True)

# Получение списка всех файлов в удаленной директории
files = ftp.nlst(remote_dir)

# Фильтрация файлов по расширению .xml
xml_files = [f for f in files if f.endswith('.xml')]

# Скачивание каждого файла
for file in xml_files:
    local_file_path = os.path.join(local_dir, os.path.basename(file))  # Путь к локальному файлу
    print(f'Saving {file} to {local_file_path}')
    
    with open(local_file_path, 'wb') as local_file:
        # Используем 'RETR' для получения файла
        ftp.retrbinary(f'RETR {file}', local_file.write)

# Завершение работы с FTP
ftp.quit()
```

### Пояснения к коду:
1. **Установка FTP-соединения**: Создаем объект `FTP`, передаем FTP-сервер и логинимся с помощью `login`.

2. **Создание локальной директории**: С помощью `os.makedirs` создаем целевую папку для сохранения файлов, если она не существует.

3. **Получение списка файлов**: Используем метод `nlst()` для получения списка всех файлов в указанной удаленной директории.

4. **Фильтрация файлов**: Отбираем только те файлы, которые имеют расширение `.xml`.

5. **Скачивание файлов**: В цикле по всем отобранным XML-файлам открываем локальный файл и используем `retrbinary` для скачивания содержимого удаленного файла.

6. **Закрытие соединения**: После завершения скачивания закрываем соединение с FTP-сервером.

### Обратите внимание:
- Убедитесь, что у вас есть права на скачивание с указанного FTP-сервера и доступ к нужной директории.
- Замените `ftp_server`, `username`, `password` и директории на ваши актуальные данные.
Как всегда, полное непонимание того что ты делаешь, какой же это треш на список делать 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 и подобные инструмент, а не этими кривыми костылями
Похожие вопросы