最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python 下載文件的幾種方式分享

 更新時(shí)間:2021年04月07日 15:55:15   作者:虎衛(wèi)兵  
這篇文章主要介紹了python 下載文件的幾種方式分享,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下

1 、一般同步下載

示例代碼:

import requests
import os

def downlaod(url, file_path):
  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0"
  }
  r = requests.get(url=url, headers=headers)
  with open(file_path, "wb") as f:
    f.write(r.content)
    f.flush()

2、 使用流式請求,requests.get方法的stream

默認(rèn)情況下是stream的值為false,它會(huì)立即開始下載文件并存放到內(nèi)存當(dāng)中,倘若文件過大就會(huì)導(dǎo)致內(nèi)存不足的情況,程序就會(huì)報(bào)錯(cuò)。
當(dāng)把get函數(shù)的stream參數(shù)設(shè)置成True時(shí),它不會(huì)立即開始下載,當(dāng)你使用iter_content或iter_lines遍歷內(nèi)容或訪問內(nèi)容屬性時(shí)才開始下載,需要注意一點(diǎn):文件沒有下載之前,它也需要保持連接。

iter_content:一塊一塊的遍歷要下載的內(nèi)容
iter_lines:一行一行的遍歷要下載的內(nèi)容

使用上面兩個(gè)函數(shù)下載大文件可以防止占用過多的內(nèi)存,因?yàn)槊看沃幌螺d小部分?jǐn)?shù)據(jù)。

示例代碼:

3 、異步下載文件

由于request的請求是阻塞式的,所以要用aiohttp模塊來發(fā)起請求。

示例代碼:

import aiohttp
import asyncio
import os


async def handler(url, file_path):
  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0"
  }
  async with aiohttp.ClientSession() as session:
    r = await session.get(url=url, headers=headers)
    with open(file_path, "wb") as f:
      f.write(await r.read())
      f.flush()
      os.fsync(f.fileno())


loop = asyncio.get_event_loop()
loop.run_until_complete(handler(url, file_path))

4、 異步拆分下載文件

上面用的是一個(gè)協(xié)程下載一個(gè)文件,下面的方法是將文件分成幾部分,每個(gè)部分用一個(gè)協(xié)程下載,最后再寫入文件。

下面這個(gè)例子用的是流式寫入,即把內(nèi)容寫入到磁盤里面。

import aiohttp
import asyncio
import time
import os


async def consumer(queue):
  option = await queue.get()
  start = option["start"]
  end = option["end"]
  url = option["url"]
  filename = option["filename"]
  i = option["i"]

  print(f"第{i}個(gè)任務(wù)開始運(yùn)行")
  async with aiohttp.ClientSession() as session:
    headers = {"Range": f"bytes={start}-{end}"}
    r = await session.get(url=url, headers=headers)
    with open(filename, "rb+") as f:
      f.seek(start)
      while True:
        chunk = await r.content.read(end - start)
        if not chunk:
          break
        f.write(chunk)
        f.flush()
        os.fsync(f.fileno())
        print(f"第{i}個(gè)任務(wù)正在寫入中ing")
    queue.task_done()
    print(f"第{i}個(gè)任務(wù)寫入成功")


async def producer(url, headers, filename, queue, coro_num):
  async with aiohttp.ClientSession() as session:
    resp = await session.head(url=url, headers=headers)
    file_size = int(resp.headers["content-length"])
    # 創(chuàng)建一個(gè)文件
    with open(filename, "wb") as f:
      pass
    part = file_size // coro_num
    for i in range(coro_num):
      start = part * i
      if i == coro_num - 1:
        end = file_size
      else:
        end = start + part
      info = {
        "start": start,
        "end": end,
        "url": url,
        "filename": filename,
        "i": i,
      }
      queue.put_nowait(info)


async def main():
  # 需要填的有url,filename,coro_num
  url = ""
  filename = ""
  coro_num = 0
  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0"
  }
  queue = asyncio.Queue(coro_num)
  await producer(url, headers, filename, queue, coro_num)
  task_list = []
  for i in range(coro_num):
    task = asyncio.create_task(consumer(queue))
    task_list.append(task)
  await queue.join()
  for i in task_list:
    i.cancel()
  await asyncio.gather(*task_list)


startt = time.time()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
end = time.time() - startt
print(f"用了{(lán)end}秒")

5、注意

以上的示例都是介紹思路,程序并不健壯,健壯的程序需要加入錯(cuò)誤捕獲和錯(cuò)誤處理。

以上就是python 下載文件的幾種方式分享的詳細(xì)內(nèi)容,更多關(guān)于python 下載文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python numpy中multiply與*及matul 的區(qū)別說明

    python numpy中multiply與*及matul 的區(qū)別說明

    這篇文章主要介紹了python numpy中multiply與*及matul 的區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python 編程語言詳細(xì)介紹

    Python 編程語言詳細(xì)介紹

    這篇文章主要分享的是 Python 編程語言的詳細(xì)介紹,Python 由 Guido van Rossum 設(shè)計(jì),作為“ABC”編程語言的繼承者,于 1991 年首次發(fā)布。它是一種高級通用語言,其設(shè)計(jì)理念是通過使用縮進(jìn)來強(qiáng)調(diào)代碼的可讀性。文章具有一定的參考價(jià)值,需要的朋友可以參考一下
    2021-11-11
  • 使用matplotlib繪制圖例標(biāo)簽中帶有公式的圖

    使用matplotlib繪制圖例標(biāo)簽中帶有公式的圖

    今天小編就為大家分享一篇使用matplotlib繪制圖例標(biāo)簽中帶有公式的圖,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python中 logging的使用詳解

    python中 logging的使用詳解

    這篇文章主要介紹了python中 logging的使用,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-10-10
  • python的rllib庫你了解嗎

    python的rllib庫你了解嗎

    這篇文章主要介紹了python urllib庫的使用,幫助大家更好的利用python學(xué)習(xí)爬蟲,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-11-11
  • OpenCV實(shí)現(xiàn)機(jī)器人對物體進(jìn)行移動(dòng)跟隨的方法實(shí)例

    OpenCV實(shí)現(xiàn)機(jī)器人對物體進(jìn)行移動(dòng)跟隨的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于OpenCV實(shí)現(xiàn)機(jī)器人對物體進(jìn)行移動(dòng)跟隨的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Python中的套接字編程是什么?

    Python中的套接字編程是什么?

    不可否認(rèn),互聯(lián)網(wǎng)已成為“存在之魂”,其活動(dòng)以“連接”或“網(wǎng)絡(luò)”為特征.使用套接字的最關(guān)鍵的基礎(chǔ)之一,使這些網(wǎng)絡(luò)成為可能.本文涵蓋了有關(guān)使用Python進(jìn)行套接字編程的所有領(lǐng)域.套接字可以幫助您建立這些連接,而Python無疑可以簡化連接,需要的朋友可以參考下
    2021-06-06
  • 詳解Python中defaultdict的具體使用

    詳解Python中defaultdict的具體使用

    defaultdict 是一個(gè)類似字典的容器,屬于 collections 模塊, 它是字典的子類, 因此它具有詞典的所有功能,下面小編就來和大家詳細(xì)聊聊defaultdict的具體使用吧
    2023-10-10
  • Python實(shí)現(xiàn)Opencv cv2.Canny()邊緣檢測

    Python實(shí)現(xiàn)Opencv cv2.Canny()邊緣檢測

    這篇博客將介紹Canny邊緣檢測的概念,并利用cv2.Canny()實(shí)現(xiàn)邊緣檢測,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 基于python+pandoc實(shí)現(xiàn)html批量轉(zhuǎn)word

    基于python+pandoc實(shí)現(xiàn)html批量轉(zhuǎn)word

    pandoc是一個(gè)強(qiáng)大的文檔格式轉(zhuǎn)換工具,支持豐富的格式轉(zhuǎn)換,并盡可能的保留原來的排版,號稱文檔格式轉(zhuǎn)換的瑞士軍刀,本文將給大家介紹一下使用python搭配pandoc實(shí)現(xiàn)html批量轉(zhuǎn)word,感興趣的朋友可以參考閱讀下
    2023-09-09

最新評論

虞城县| 正镶白旗| 垦利县| 灵宝市| 平度市| 穆棱市| 两当县| 贵南县| 永川市| 河间市| 延川县| 曲靖市| 连平县| 稻城县| 淳安县| 洮南市| 晋州市| 寿宁县| 宁晋县| 喜德县| 贡觉县| 延吉市| 东阳市| 策勒县| 鄂温| 南阳市| 乌兰察布市| 章丘市| 集安市| 牡丹江市| 滦平县| 女性| 拉萨市| 犍为县| 兴宁市| 安国市| 舒兰市| 旅游| 桃江县| 安龙县| 九台市|