79

我正在尝试下载一些公共数据文件。我截屏以获取文件的链接,它们看起来都像这样:

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

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

4

9 回答 9

107

requests库不支持 ftp 链接。

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

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

或者:

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:

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)
于 2012-08-01T22:22:07.270 回答
65

你可以试试这个

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()
于 2012-09-14T12:12:19.837 回答
17

尝试使用 python 的 wget 库。您可以在此处找到它的文档。

import wget
link = 'ftp://example.com/foo.txt'
wget.download(link)
于 2018-01-10T09:10:23.897 回答
7

使用urllib2。有关更多详细信息,请查看doc.python.org 中的此示例

这是教程中的一个片段,可能会有所帮助

import urllib2

req = urllib2.Request('ftp://example.com')
response = urllib2.urlopen(req)
the_page = response.read()
于 2012-08-01T22:13:20.010 回答
7
    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')
于 2014-10-01T18:11:12.967 回答
4

正如一些人所指出的,请求不支持 FTP,但 Python 有其他库支持。如果你想继续使用 requests 库,有一个requests-ftp包,它为请求添加了 FTP 功能。我已经使用了这个库,它确实有效。不过,文档中充满了关于代码质量的警告。从 0.2.0 开始,文档说“这个库在大约 4 小时的总工作中被牛仔装在一起,没有测试,并且依赖于一些丑陋的黑客”。

import requests, requests_ftp
requests_ftp.monkeypatch_session()
response = requests.get('ftp://example.com/foo.txt')
于 2015-01-07T15:30:23.237 回答
3

如果您想利用最新 Python 版本的异步功能,您可以使用aioftp(与更流行的 aiohttp 库来自同一系列的库和开发人员)。这是从他们的客户端教程中获取的代码示例:

client = aioftp.Client()
await client.connect("ftp.server.com")
await client.login("user", "pass")
await client.download("tmp/test.py", "foo.py", write_into=True)
于 2020-03-25T13:08:48.343 回答
2

urllib2.urlopen处理 ftp 链接。

于 2012-08-01T22:02:18.757 回答
1

urlretrieve 对我不起作用,官方文件说它们将来可能会被弃用。

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)
于 2018-04-15T03:50:38.670 回答