Python3學習筆記(十八):文件上傳和下載


文件上傳

以人人網上傳頭像為例,用Fiddler抓取的上傳頭像接口報文如下

上傳頭像圖片代碼:

import requests

upload_url = 'http://upload.renren.com/upload.fcgi?pagetype=addpublishersingle&hostid=969693640&callback=window.parent.handlePhotoData&uploadid=profile_publisher_photo_1549803016407'
data = {
    "upload": "提交",
    "__channel": "renren",
    "privacyParams": '{"sourceControl": 99}',
    "hostid": "969693640",
    "requestToken": "1983570051",
    "_rtk": "41fbdedd"
}
files = {'file':('20180527214514.png',open("D:\\20180527214514.png","rb"),"image/png")}
headers = {
    "Content-Type": "multipart/form-data",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
    "Cookie": "anonymid=jqaq5unrglqofe; _r01_=1; _de=0A77BBB010E3F31F230189D3D5BDB247; depovince=GW; ick_login=77da0297-4cd5-4b1c-8a27-e5c0c3cd5225; ick=36f73ac4-827f-4c32-a0dc-2bc674f2f101; __utma=151146938.867379497.1546164320.1546164320.1549801247.2; __utmc=151146938; __utmz=151146938.1549801247.2.2.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmb=151146938.10.10.1549801247; t=d61f48b472869e4873c3ce871b8afa490; societyguester=d61f48b472869e4873c3ce871b8afa490; id=969693640; xnsid=288bb964; jebecookies=46621450-73a5-41db-982f-ab36a5170dbb|||||; ver=7.0; loginfrom=null; springskin=set; jebe_key=a5ea1884-792f-4b19-9a89-f60c153512d7%7C96f44a5209ae47155358d1204ba3ec93%7C1549802951410%7C1%7C1549802951375; vip=1; wp_fold=0"
 }
rec = requests.post(url=upload_url,data=data,headers=headers,files=files)

文件下載

方法一:

使用 urllib 模塊提供的 urlretrieve() 函數。urlretrieve() 方法直接將遠程數據下載到本地。

urlretrieve(url, [filename=None, [reporthook=None, [data=None]]])

說明:

  • 參數 finename 指定了保存本地路徑(如果參數未指定,urllib會生成一個臨時文件保存數據。)

  • 參數 reporthook 是一個回調函數,當連接上服務器、以及相應的數據塊傳輸完畢時會觸發該回調,我們可以利用這個回調函數來顯示當前的下載進度。

  • 參數 data 指 post 到服務器的數據,該方法返回一個包含兩個元素的(filename, headers)元組,filename 表示保存到本地的路徑,header 表示服務器的響應頭。 

實例:

from urllib import request

load_url = 'http://docs.python-requests.org/zh_CN/latest/_static/requests-sidebar.png'


def Schedule(a,b,c):
    '''
    a:已經下載的數據塊
    b:數據塊的大小
    c:遠程文件的大小
   '''
    per = 100.0 * a * b / c
    if per > 100 :
        per = 100
    print('%.2f%%' % per)


request.urlretrieve(url=load_url,filename='d:\\python.png',reporthook=Schedule)

方法二:

使用requests模塊

import requests

load_url = 'http://docs.python-requests.org/zh_CN/latest/_static/requests-sidebar.png'

rec = requests.get(url=load_url,stream=True)
with open("D:\\python.png","wb") as f:
    for chunk in rec.iter_content(chunk_size=1024):
        f.write(chunk)
  • stream參數默認為False,它會立即開始下載文件並放到內存中,如果文件過大,有可能導致內存不足。

  • stream參數設置成True時,它不會立即開始下載,當你使用iter_content或iter_lines遍歷內容或訪問內容屬性時才開始下載。

  • iter_content:一塊一塊的遍歷要下載的內容

  • iter_lines:一行一行的遍歷要下載的內容

使用上面兩個函數下載大文件可以防止占用過多的內存,因為每次只下載小部分數據。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM