Python: загрузка файла через FTP-сервер
Я пытаюсь загрузить некоторые общедоступные файлы данных. Я делаю скриншот, чтобы получить ссылки на файлы, которые выглядят примерно так:
ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/nhanes/2001-2002/L28POC_B.xpt
Я не могу найти документацию на веб-сайте библиотеки запросов.1
Ответы
Ответ 1
Библиотека 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)
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)
Ответ 2
Вы можете попробовать это
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()
Ответ 3
Используйте urllib2. Для получения дополнительной информации ознакомьтесь с этим с doc.python.org:
Вот фрагмент из учебника, который может помочь
import urllib2
req = urllib2.Request('ftp://example.com')
response = urllib2.urlopen(req)
the_page = response.read()
Ответ 4
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')
Ответ 5
Как отмечают некоторые люди, запросы не поддерживают FTP, но у Python есть другие библиотеки. Если вы хотите продолжать использовать библиотеку запросов, есть requests-ftp пакет, который добавляет возможности FTP для запросов. Я немного использовал эту библиотеку, и она работает. Однако документы заполнены предупреждениями о качестве кода. Начиная с 0.2.0, документы говорят: "Эта библиотека была собрана вместе примерно за 4 часа общей работы, не имела тестов и полагалась на несколько уродливых хаков".
import requests, requests_ftp
requests_ftp.monkeypatch_session()
response = requests.get('ftp://example.com/foo.txt')
Ответ 6
Попробуйте использовать библиотеку wget для python. Вы можете найти документацию для этого здесь.
import wget
link = 'ftp://example.com/foo.txt'
wget.download(link)
Ответ 7
urllib2.urlopen
обрабатывает ftp-ссылки.
Ответ 8
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)