免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

python分包壓縮的方法-創新互聯

創新互聯www.cdcxhl.cn八線動態BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!

從事服務器托管,服務器租用,云主機,網絡空間,空間域名,CDN,網絡代維等服務。

不懂python分包壓縮的方法?其實想解決這個問題也不難,下面讓小編帶著大家一起學習怎么去解決,希望大家閱讀完這篇文章后大所收獲。

利用 Python 壓縮 ZIP 文件,我們第一反應是使用 zipfile 庫,然而,它的官方文檔中卻明確標注“此模塊目前不能處理分卷 ZIP 文件”(⊙﹏⊙)

1、折騰經過:

翻遍了Google、CSDN、Stackoverflow等平臺均未找到解決方案,最靠譜的是調用外部解壓程序實現分卷壓縮的功能。但是,如何不依靠外部程序實現這個功能呢??

于是乎,只能自己慢慢造輪子。看著 ZIP 格式開發商留下的文檔 ZIP File Format Specification,頭疼啊(;′д`)。于是我拿著 WinHex 開始16進制一個一個文件對比 WinRar 創建的分卷壓縮和單個 zip 文件的差異。最后還真的整出來了( ̄▽ ̄)"

python分包壓縮的方法

如果想把單個大文件 test.zip -> 分卷文件 test.z01、test.z02、test.zip

首先,在創建的第一個分卷文件 test.z01的前面加上 \x50\x4b\x07\x08 這個是分卷壓縮的文件頭(header),占4個字節。其實單個壓縮文件本身 header 就有這個了,而分卷壓縮的需要兩個emmm。之后便是從單個大壓縮文件文件test.zip中讀取 "一個分卷大小 -4 個字節"的數據,寫入test.z01中,如何接著讀取一個分卷大小的數據,寫入test.z02,以此類推,最后一個分卷文件名也是test.zip。

2、Python3的代碼實現:

import os
import zipfile
def zip_by_volume(file_path, block_size):
    """zip文件分卷壓縮"""
    file_size = os.path.getsize(file_path)  # 文件字節數
    path, file_name = os.path.split(file_path)  # 除去文件名以外的path,文件名
    suffix = file_name.split('.')[-1]  # 文件后綴名
    # 添加到臨時壓縮文件
    zip_file = file_path + '.zip'
    with zipfile.ZipFile(zip_file, 'w') as zf:
        zf.write(file_path, arcname=file_name)
    # 小于分卷尺寸則直接返回壓縮文件路徑
    if file_size <= block_size:
        return zip_file
    else:
        fp = open(zip_file, 'rb')
        count = file_size // block_size + 1
        # 創建分卷壓縮文件的保存路徑
        save_dir = path + os.sep + file_name + '_split'
        if os.path.exists(save_dir):
            from shutil import rmtree
            rmtree(save_dir)
        os.mkdir(save_dir)
        # 拆分壓縮包為分卷文件
        for i in range(1, count + 1):
            _suffix = 'z{:0>2}'.format(i) if i != count else 'zip'
            name = save_dir + os.sep + file_name.replace(str(suffix), _suffix)
            f = open(name, 'wb+')
            if i == 1:
                f.write(b'\x50\x4b\x07\x08')  # 添加分卷壓縮header(4字節)
                f.write(fp.read(block_size - 4))
            else:
                f.write(fp.read(block_size))
        fp.close()
        os.remove(zip_file)     # 刪除臨時的 zip 文件   
        return save_dir
if __name__ == '__main__':
    file = r"D:\Downloads\1.mp4"        # 原始文件
    volume_size = 1024 * 1024 * 100  # 分卷大小 100MB
    path = zip_by_volume(file, volume_size)
    print(path)     # 輸出分卷壓縮文件的路徑

3、缺點:

該方法創建分卷壓縮的時候,需要先在磁盤創建一個臨時壓縮包,然后將其拆分,實際上會對磁盤寫入兩次,這就浪費了時間。

當然,我嘗試使用 ByteIO 進行字節流的壓縮,但是這種方式需要先把文件讀入內存,對于超級大的文件,這是不現實的,分分鐘內存爆炸。

然后,我嘗試使用 io.pipe 的管道來處理,而 zipfile 壓縮需要提供一個 file 或 file-like 對象,這個對象必須實現 seek() 和 tell() 方法來回去寫入文件頭信息,然而管道流沒辦法seek回去修改數據。這里,參考了Python zipfile + os.pipe()探索記,屏蔽了 seek() 和 tell() 函數。但是,后面我分卷時需要指定讀取的字節數,這就需要這兩個函數。。。我大概知道為什么 zipfile 庫不支持創建分卷文件了〒▽〒

這個庫的作者也沒少掉頭發。。。現在就將就一下,這樣用著吧。。。

感謝你能夠認真閱讀完這篇文章,希望小編分享python分包壓縮的方法內容對大家有幫助,同時也希望大家多多支持創新互聯,關注創新互聯-成都網站建設公司行業資訊頻道,遇到問題就找創新互聯,詳細的解決方法等著你來學習!

本文標題:python分包壓縮的方法-創新互聯
當前地址:http://m.newbst.com/article26/dpshcg.html

成都網站建設公司_創新互聯,為您提供外貿建站搜索引擎優化建站公司企業建站定制開發手機網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

營銷型網站建設