Python: download a file over an FTP server
我正在下载一些公共数据文件。我通过截屏获取文件的链接,这些文件看起来都是这样的:
1 | ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/nhanes/2001-2002/L28POC_B.xpt |
我在请求库网站上找不到任何文档。1
事先谢谢!
要从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) |
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) |
。