파이썬에서 디스크에 기본 http 파일 다운로드 및 저장?


159

저는 Python을 처음 사용하고이 사이트에서 Q & A를 진행하면서 질문에 대한 답변을 받았습니다. 그러나 나는 초보자이며 일부 솔루션을 이해하기가 어렵습니다. 매우 기본적인 솔루션이 필요합니다.

누군가 'http를 통해 파일 다운로드'와 'Windows의 디스크에 파일 저장'에 대한 간단한 해결책을 설명해 주시겠습니까?

shutil 및 os 모듈을 사용하는 방법을 잘 모르겠습니다.

다운로드하려는 파일은 500MB 미만이고 .gz 아카이브 파일입니다. 누군가 아카이브를 추출하고 파일을 활용하는 방법을 설명 할 수 있다면 좋을 것입니다!

다음은 다양한 답변을 결합하여 작성한 부분 솔루션입니다.

import requests
import os
import shutil

global dump

def download_file():
    global dump
    url = "http://randomsite.com/file.gz"
    file = requests.get(url, stream=True)
    dump = file.raw

def save_file():
    global dump
    location = os.path.abspath("D:\folder\file.gz")
    with open("file.gz", 'wb') as location:
        shutil.copyfileobj(dump, location)
    del dump

누군가가 오류 (초보자 수준)를 지적하고 더 쉬운 방법을 설명 할 수 있습니까?

감사!

답변:


207

파일을 다운로드하는 확실한 방법은 다음과 같습니다.

import urllib

testfile = urllib.URLopener()
testfile.retrieve("http://randomsite.com/file.gz", "file.gz")

웹 사이트에서 파일을 다운로드하고 이름을 지정합니다 file.gz. 이것은 urllib 및 python을 통해 그림 다운로드 에서 내가 가장 좋아하는 솔루션 중 하나입니다 .

이 예제는 urllib라이브러리 를 사용 하며 소스에서 파일을 직접 검색합니다.


3
알았어 고마워! 그러나 요청을 처리하는 방법이 있습니까?
arvindch

5
/myfolder/file.gz에 저장할 수 있습니까?
John Snow

17
직접 시도하는 것보다 더 나은 가능성은 없습니까? :) 나는 성공적으로 할 수 있었다 testfile.retrieve("http://example.com/example.rpm", "/tmp/test.rpm").
Dharmit

18
이것은 Python 3.3부터 사용되지 않으며 urllib.request.urlretrieve 솔루션 (아래 답변 참조)은 '현대적인'방식입니다.
MichielB

1
이 코드에 사용자 이름과 비밀번호를 추가하는 가장 좋은 방법은 무엇입니까? tks
Estefy

110

여기에 언급 한 바와 같이 :

import urllib
urllib.urlretrieve ("http://randomsite.com/file.gz", "file.gz")

EDIT:여전히 요청을 사용하려면 이 질문 또는 질문을 살펴보십시오 .


1
urllib는 작동하지만 많은 사람들이 urllib보다 요청을 사용하는 것이 좋습니다. 왜 그래?
arvindch

2
requestsurllibREST API로 작업 할 때와 비교할 때 매우 유용 합니다. 더 많은 것을하고자하지 않는 한, 이것은 좋을 것입니다.
dparpyani

이제 요청 사용법에 대해 제공 한 링크를 읽었습니다. 다운로드를 저장하기 위해 파일 경로를 선언하는 방법에 대해 혼란 스럽습니다. 이것을 위해 os와 shutil을 어떻게 사용합니까?
arvindch

62
Python3의 경우 :import urllib.request urllib.request.urlretrieve(url, filename)
Flash

1
나는 다운로드가 실패 할 경우이와 HTTP 상태 코드를 추출 할 수 아니다
Aashish Thite

34

wget을 사용 합니다.

예를 들어 간단하고 좋은 도서관?

import wget

file_url = 'http://johndoe.com/download.zip'

file_name = wget.download(file_url)

wget 모듈은 python 2 및 python 3 버전을 지원합니다


33

wget, urllib 및 request를 사용하는 네 가지 방법.

#!/usr/bin/python
import requests
from StringIO import StringIO
from PIL import Image
import profile as profile
import urllib
import wget


url = 'https://tinypng.com/images/social/website.jpg'

def testRequest():
    image_name = 'test1.jpg'
    r = requests.get(url, stream=True)
    with open(image_name, 'wb') as f:
        for chunk in r.iter_content():
            f.write(chunk)

def testRequest2():
    image_name = 'test2.jpg'
    r = requests.get(url)
    i = Image.open(StringIO(r.content))
    i.save(image_name)

def testUrllib():
    image_name = 'test3.jpg'
    testfile = urllib.URLopener()
    testfile.retrieve(url, image_name)

def testwget():
    image_name = 'test4.jpg'
    wget.download(url, image_name)

if __name__ == '__main__':
    profile.run('testRequest()')
    profile.run('testRequest2()')
    profile.run('testUrllib()')
    profile.run('testwget()')

testRequest-20.236 초 안에 4469882 함수 호출 (4469842 프리미티브 호출)

testRequest2-0.072 초 안에 8580 개의 함수 호출 (8574 개의 원시 호출)

testUrllib-0.036 초 안에 3810 개의 함수 호출 (3775 개의 원시 호출)

testwget-0.020 초 안에 3489 개의 함수 호출


1
함수 호출 횟수는 어떻게 얻었습니까?
Abdelhak

29

들어 Python3 + URLopener 되지 않습니다. 그리고 사용하면 아래와 같이 오류가 발생합니다.

url_opener = urllib.URLopener () AttributeError : 'urllib'모듈에 'URLopener'속성이 없습니다.

따라서 다음을 시도하십시오.

import urllib.request 
urllib.request.urlretrieve(url, filename)

1
이상한 ... 왜 파이썬 2가 더 이상 사용되지
않고이

1
동의했다! 이전 솔루션보다 머리카락을 잡아 당겼습니다. 내가 200 번 공감할 수 있으면 좋겠다!
Yechiel K

5

이국적인 Windows 솔루션

import subprocess

subprocess.run("powershell Invoke-WebRequest {} -OutFile {}".format(your_url, filename), shell=True)

1

ESXi의 wget이 SSL로 컴파일되지 않았기 때문에이 경로를 시작했으며 공급 업체의 웹 사이트에서 반대편에있는 ESXi 호스트로 OVA를 직접 다운로드하고 싶었습니다.

규칙을 수정하여 방화벽을 비활성화 (lazy) / https를 활성화해야합니다 (적절한)

파이썬 스크립트를 만들었습니다 :

import ssl
import shutil
import tempfile
import urllib.request
context = ssl._create_unverified_context()

dlurl='https://somesite/path/whatever'
with urllib.request.urlopen(durl, context=context) as response:
    with open("file.ova", 'wb') as tmp_file:
        shutil.copyfileobj(response, tmp_file)

ESXi 라이브러리는 쌍을 이루었지만 오픈 소스 족제비 설치 프로그램은 https에 urllib를 사용하는 것처럼 보였습니다.


-5

파일을 저장하는 또 다른 깨끗한 방법은 다음과 같습니다.

import csv
import urllib

urllib.retrieve("your url goes here" , "output.csv")

이것은 아마도 urllib.urlretrieve또는 urllib.URLopener().retrieve명확하지 않아야 합니다.
mateor

9
파일 이름을 지정하는 경우 왜 CSV를 가져 옵니까?
Azeezah M
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.