Python:通过FTP服务器下载文件

Python: download a file over an FTP server

我正在下载一些公共数据文件。我通过截屏获取文件的链接,这些文件看起来都是这样的:

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

我在请求库网站上找不到任何文档。1

事先谢谢!


requests库不支持ftp链接。

要从ftp服务器下载文件,您可以:

1
2
3
4
5
import urllib

urllib.urlretrieve('ftp://server/path/to/file', 'file')
# if you need to pass credentials:
#   urllib.urlretrieve('ftp://username:password@server/path/to/file', 'file')

或:

1
2
3
4
5
6
7
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)

Python3:

1
2
3
4
5
6
7
import shutil
import urllib.request as request
from contextlib import closing

with closing(request.urlopen('ftp://server/path/to/file')) as r:
    with open('file', 'wb') as f:
        shutil.copyfileobj(r, f)


你可以试试这个

1
2
3
4
5
6
7
8
9
10
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()


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    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')


使用URLLIB2。有关详细信息,请参阅doc.python.org中的以下示例:

本教程中的一个片段可能会有所帮助

1
2
3
4
5
import urllib2

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

正如一些人所指出的,请求不支持ftp,但python有其他的库。如果您想继续使用请求库,有一个请求ftp包可以向请求添加ftp功能。我用过这个图书馆,它确实有用。但是文档中充满了关于代码质量的警告。在0.2.0版本中,文档说"这个库在大约4个小时的总工作时间内被牛仔化了,没有测试,并且依赖于一些丑陋的黑客"。

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


尝试使用wget库for python。您可以在这里找到它的文档。

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


urllib2.urlopen处理ftp链接。


Urlretrieve不适合我,官方文件说他们可能在将来的某个时候被否决。

1
2
3
4
5
6
7
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)