Вопрос по python, download, ftp – Python: скачать файл через FTP-сервер

41

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

ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/nhanes/2001-2002/L28POC_B.xpt

Я не могу найти какую-либо документацию на веб-сайте библиотеки запросов.1

Заранее спасибо!

Ваш Ответ

8   ответов
2

кументацию для этогоВот.

    import wget
    link = 'ftp://example.com/foo.txt'
    wget.download(link)
0

документ сказал, что они могут стать устаревшими в какой-то момент в будущем.

import shutil 
from urllib.request import URLopener
opener = URLopener()
url = 'ftp://ftp_domain/path/to/the/file'
store_path = 'path//to//your//local//storage'
with opener.open(url) as remote_file, open(store_path, 'wb') as local_file:
    shutil.copyfileobj(remote_file, local_file)
47

requests Библиотека не поддерживает FTP-ссылки.

Чтобы загрузить файл с FTP-сервера, вы можете:

import urllib 

urllib.urlretrieve('ftp://server/path/to/file', 'file')
# if you need to pass credentials:
#   urllib.urlretrieve('ftp://username:[email protected]/path/to/file', 'file')

Или же:

import shutil
import urllib2
from contextlib import closing

with closing(urllib2.urlopen('ftp://server/path/to/file')) as r:
    with open('file', 'wb') as f:
        shutil.copyfileobj(r, f)
Спасибо за это, но как вы можете предоставить учетные данные?
@LimokPalantaemon это эквивалентноftp.login(user, passw) вызов и, следовательно, он не зашифрован (ftp - это очень старый протокол - мало безопасности). Вместо этого вы можете попробовать sftp (ткань / парамико).
Немного урлиб против запросов информации здесь:blog.pythonlibrary.org/2012/06/07/…
@cbare: в чем смысл ссылки. Есть лиrequests служба поддержкиftp совсем?
@SSHThis: try:'ftp://username:[email protected]/path/to/file' или использовать@Rakesh's answer, Если вы не можете заставить его работать,ask.
4

запросы не поддерживают FTP, но в Python есть другие библиотеки, которые поддерживают. Если вы хотите продолжать использовать библиотеку запросов, естьЗапросы-FTP пакет, который добавляет возможность FTP к запросам. Я немного использовал эту библиотеку, и она работает. Документы полны предупреждений о качестве кода. Начиная с версии 0.2.0, в документах говорится: «Эта библиотека была собрана за 4 часа общей работы, не имеет тестов и использует несколько уродливых хаков».

import requests, requests_ftp
requests_ftp.monkeypatch_session()
response = requests.get('ftp://example.com/foo.txt')
47

import ftplib

path = 'pub/Health_Statistics/NCHS/nhanes/2001-2002/'
filename = 'L28POC_B.xpt'

ftp = ftplib.FTP("Server IP") 
ftp.login("UserName", "Password") 
ftp.cwd(path)
ftp.retrbinary("RETR " + filename, open(filename, 'wb').write)
ftp.quit()
Кодирование имени файла из юникода в «utf-8» работал на меня. Может быть, это отличается на разных ОС:ftp.retrbinary(u"RETR täßt.jpg".encode('utf-8'), open('local.jpg', 'wb').write)
Что если в имени файла на сервере есть специальные символы, например, & APOS; & apos ;, $, & amp; и т.д. Нужно ли мне бежать от них?
Имя файла может быть произвольной байтовой последовательностью с несколькими исключениями, такими какb'\xff'  (Я не знаю ни одного стандартного способа избежать таких имен). Здесь & APOS; smore detail (in Russian), Вы можете задать отдельный вопрос о переполнении стека, если у вас есть специфическая проблема с именами файлов ftp
6
    import os
    import ftplib
    from contextlib import closing

    with closing(ftplib.FTP()) as ftp:
        try:
            ftp.connect(host, port, 30*5) #5 mins timeout
            ftp.login(login, passwd)
            ftp.set_pasv(True)
            with open(local_filename, 'w+b') as f:
                res = ftp.retrbinary('RETR %s' % orig_filename, f.write)

                if not res.startswith('226 Transfer complete'):
                    print('Downloaded of file {0} is not compile.'.format(orig_filename))
                    os.remove(local_filename)
                    return None

            return local_filename

        except:
                print('Error during download from FTP')
У меня есть совершенно не связанный с этим вопрос, но связанный с вашим кодом, загруженным на github:stackoverflow.com/questions/27584233/…
7

urllib2, Для более подробной информации, проверьте этопример из doc.python.org:

Вот фрагмент из учебника, который может помочь

import urllib2

req = urllib2.Request('ftp://example.com')
response = urllib2.urlopen(req)
the_page = response.read()
1

urllib2.urlopen обрабатывает FTP-ссылки.

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