it-swarm.com.de

Python: Laden Sie eine Datei über einen FTP-Server herunter

Ich versuche, einige öffentliche Datendateien herunterzuladen. Ich screencrape, um die Links zu den Dateien zu erhalten, die alle ungefähr so ​​aussehen:

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

Ich kann keine Dokumentation auf der Website der Requests-Bibliothek finden. 1

Danke im Voraus!

39
user1507455

requests library unterstützt keine FTP-Links.

Um eine Datei vom FTP-Server herunterzuladen, können Sie:

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')

Oder:

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)
47
jfs

Sie können dies versuchen

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()
46
Rakesh

Verwenden Sie urllib2 . Weitere Einzelheiten finden Sie in diesem Beispiel von doc.python.org :

Hier ist ein Ausschnitt aus dem Tutorial, der helfen kann

import urllib2

req = urllib2.Request('ftp://example.com')
response = urllib2.urlopen(req)
the_page = response.read()
7
Parker
    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')
6
Roman Podlinov

Wie bereits erwähnt, unterstützen Anforderungen kein FTP, aber Python hat andere Bibliotheken, die dies tun. Wenn Sie die Anforderungsbibliothek weiterhin verwenden möchten, gibt es ein Paket request-ftp , das den Anforderungen FTP-Fähigkeit hinzufügt. Ich habe diese Bibliothek ein wenig benutzt und sie funktioniert. Die Dokumente enthalten jedoch zahlreiche Warnungen zur Codequalität. Ab 0.2.0 sagen die Doktoren "Diese Bibliothek wurde in etwa 4 Stunden Gesamtarbeit zusammen Cowboy, hat keine Tests und verlässt sich auf ein paar hässliche Hacks".

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

Verwenden Sie die Wget-Bibliothek für Python. Die Dokumentation dazu finden Sie hier .

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

urllib2.urlopen behandelt FTP-Links.

1
Victor Gavro

urlretrieve ist für mich keine Arbeit, und das offizielle document sagte, dass sie irgendwann in der Zukunft veraltet sein könnten.

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)
0
GoatWang