Как скачать файл с ftp? - PullRequest
       43

Как скачать файл с ftp?

4 голосов
/ 10 августа 2011

Я пишу сценарий установки на python.

Как загрузить файл с ftp на python?

Операционная система - Windows XP - если это имеет значение.

Ответы [ 4 ]

6 голосов
/ 10 августа 2011
from urllib2 import urlopen
req = urlopen('ftp://ftp.gnu.org/README')

Затем вы можете использовать req.read(), чтобы загрузить содержимое файла в переменную или сделать что-либо еще с ней, или shutil.copyfileobj, чтобы сохранить содержимое на диск без загрузки его в память.

3 голосов
/ 10 августа 2011

Вот фрагмент кода, который я сейчас использую.

import mimetypes
import os
import urllib2
import urlparse

def filename_from_url(url):
    return os.path.basename(urlparse.urlsplit(url)[2])

def download_file(url):
    """Create an urllib2 request and return the request plus some useful info"""
    name = filename_from_url(url)
    r = urllib2.urlopen(urllib2.Request(url))
    info = r.info()
    if 'Content-Disposition' in info:
        # If the response has Content-Disposition, we take filename from it
        name = info['Content-Disposition'].split('filename=')[1]
        if name[0] == '"' or name[0] == "'":
            name = name[1:-1]
    elif r.geturl() != url:
        # if we were redirected, take the filename from the final url
        name = filename_from_url(r.geturl())
    content_type = None
    if 'Content-Type' in info:
        content_type = info['Content-Type'].split(';')[0]
    # Try to guess missing info
    if not name and not content_type:
        name = 'unknown'
    elif not name:
        name = 'unknown' + mimetypes.guess_extension(content_type) or ''
    elif not content_type:
        content_type = mimetypes.guess_type(name)[0]
    return r, name, content_type

Использование:

req, filename, content_type = download_file('http://some.url')

Затем вы можете использовать req как объект, похожий на файл и, например, использовать shutil.copyfileobj() для копирования содержимого файла в локальный файл.Если тип MIME не имеет значения, просто удалите эту часть кода.

Поскольку вам кажется, что вы ленивы, вот код загрузки файла непосредственно в локальный файл:

import shutil
def download_file_locally(url, dest):
    req, filename, content_type = download_file(url)        
    if dest.endswith('/'):
        dest = os.path.join(dest, filename)
    with open(dest, 'wb') as f:
        shutil.copyfileobj(req, f)
    req.close()

ЭтоМетод достаточно умен, чтобы использовать имя файла, отправленное сервером, если вы указываете путь, заканчивающийся косой чертой, в противном случае он использует указанное вами место назначения.

1 голос
/ 10 августа 2011

Использование ftplib

Пример кода из документации:

>>> from ftplib import FTP
>>> ftp = FTP('ftp.cwi.nl')   # connect to host, default port
>>> ftp.login()               # user anonymous, passwd anonymous@
>>> ftp.retrlines('LIST')     # list directory contents
total 24418
drwxrwsr-x   5 ftp-usr  pdmaint     1536 Mar 20 09:48 .
dr-xr-srwt 105 ftp-usr  pdmaint     1536 Mar 21 14:32 ..
-rw-r--r--   1 ftp-usr  pdmaint     5305 Mar 20 09:48 INDEX
 .
 .
 .
>>> ftp.retrbinary('RETR README', open('README', 'wb').write)
'226 Transfer complete.'
>>> ftp.quit()
0 голосов
/ 07 августа 2017
from urllib.request import urlopen
try:
    req = urlopen('ftp://ftp.expasy.org/databases/enzyme/enzclass.txt')
except:
    print ("Error")
...