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

詳解Python如何實(shí)現(xiàn)壓縮與解壓縮數(shù)據(jù)

 更新時(shí)間:2024年02月25日 10:05:31   作者:古明地覺(jué)的編程教室  
當(dāng)數(shù)據(jù)量大的時(shí)候,自然而然想到的就是對(duì)數(shù)據(jù)進(jìn)行壓縮,這篇文章主要為大家介紹了Python可以實(shí)現(xiàn)壓縮與解壓縮數(shù)據(jù)的相關(guān)模塊的使用,希望對(duì)大家有所幫助

楔子

當(dāng)數(shù)據(jù)量大的時(shí)候,自然而然想到的就是對(duì)數(shù)據(jù)進(jìn)行壓縮,下面來(lái)看看 Python 如何壓縮數(shù)據(jù)。這里主要介紹三個(gè)模塊,分別是 zlib、bz2、gzip,它們都是內(nèi)置的,直接導(dǎo)入即可,不需要額外安裝。

那么下面就開(kāi)始吧。

zlib 模塊

看一下 zlib 模塊的用法。

import zlib

original_data = b"komeiji satori is a cute girl"
print(len(original_data))
"""
29
"""

# 對(duì)數(shù)據(jù)進(jìn)行壓縮
compressed_data = zlib.compress(original_data)
print(len(compressed_data))
"""
37
"""
# 我們看到當(dāng)數(shù)據(jù)量很小的時(shí)候,壓縮之后反而會(huì)增大


# 對(duì)數(shù)據(jù)進(jìn)行解壓
print(
    zlib.decompress(compressed_data) == original_data
)
"""
True
"""

在壓縮的時(shí)候還可以指定壓縮級(jí)別:

import zlib

original_data = b"komeiji satori is a cute girl" * 1024

# 壓縮級(jí)別 0 ~ 9,值越大,壓縮級(jí)別越高,默認(rèn)壓縮級(jí)別為 6
for i in range(0, 10):
    compressed_data = zlib.compress(original_data, i)
    print(f"壓縮前數(shù)據(jù)長(zhǎng)度: {len(original_data)}, "
          f"壓縮后數(shù)據(jù)長(zhǎng)度: {len(compressed_data)}")
"""
壓縮前數(shù)據(jù)長(zhǎng)度: 29696, 壓縮后數(shù)據(jù)長(zhǎng)度: 29707
壓縮前數(shù)據(jù)長(zhǎng)度: 29696, 壓縮后數(shù)據(jù)長(zhǎng)度: 245
壓縮前數(shù)據(jù)長(zhǎng)度: 29696, 壓縮后數(shù)據(jù)長(zhǎng)度: 245
壓縮前數(shù)據(jù)長(zhǎng)度: 29696, 壓縮后數(shù)據(jù)長(zhǎng)度: 245
壓縮前數(shù)據(jù)長(zhǎng)度: 29696, 壓縮后數(shù)據(jù)長(zhǎng)度: 122
壓縮前數(shù)據(jù)長(zhǎng)度: 29696, 壓縮后數(shù)據(jù)長(zhǎng)度: 122
壓縮前數(shù)據(jù)長(zhǎng)度: 29696, 壓縮后數(shù)據(jù)長(zhǎng)度: 122
壓縮前數(shù)據(jù)長(zhǎng)度: 29696, 壓縮后數(shù)據(jù)長(zhǎng)度: 122
壓縮前數(shù)據(jù)長(zhǎng)度: 29696, 壓縮后數(shù)據(jù)長(zhǎng)度: 122
壓縮前數(shù)據(jù)長(zhǎng)度: 29696, 壓縮后數(shù)據(jù)長(zhǎng)度: 122
"""

壓縮級(jí)別越高,速度越慢,但壓縮之后的數(shù)據(jù)體積也越小。

如果你要壓縮的數(shù)據(jù)過(guò)大,那么還可以采用增量壓縮。

from io import BytesIO
import zlib

# 用 buffer 模擬大文件
original_data = b"komeiji satori is a cute girl" * 1024
buffer = BytesIO()
buffer.write(original_data)
buffer.seek(0)

# 創(chuàng)建壓縮器,壓縮等級(jí)為 5
compressor = zlib.compressobj(5)
# 每次讀取 1024 字節(jié),進(jìn)行壓縮
while (data := buffer.read(1024)) != b"":
    compressor.compress(data)
# 循環(huán)結(jié)束之后,壓縮結(jié)束,調(diào)用 flush 方法拿到壓縮數(shù)據(jù)
compressed_data = compressor.flush()

# 這里我們進(jìn)行解壓,然后對(duì)比一下,看看和原始數(shù)據(jù)是否相等
# 注意:zlib 壓縮之后是有一個(gè)頭部信息的,否則會(huì)認(rèn)為數(shù)據(jù)不是 zlib 壓縮格式
# 但是增量壓縮會(huì)將頭部信息給去掉,所以解壓的時(shí)候還要手動(dòng)加上
# 這個(gè)頭部信息是 b"x\x9c",轉(zhuǎn)成十六進(jìn)制就是 "789c"
decompressed_data = zlib.decompress(b"x\x9c" + compressed_data)
print(original_data == decompressed_data) 
"""
True
"""

壓縮數(shù)據(jù)還可以和原始數(shù)據(jù)混在一起,舉個(gè)例子:

import zlib

original_data = b"komeiji satori is a cute girl" * 1024
compressed_data = zlib.compress(original_data)
combined_data = compressed_data + original_data
# 創(chuàng)建一個(gè)解壓縮器
decompressor = zlib.decompressobj()
# 對(duì) combined_data 進(jìn)行解壓,只會(huì)得到對(duì) compressed_data 解壓之后的數(shù)據(jù)
# 由于 zlib 會(huì)在壓縮數(shù)據(jù)前面加上一個(gè)頭部信息,所以 combined_data 要求必須是壓縮數(shù)據(jù)在前
decompressed_data = decompressor.decompress(combined_data)
# 和原始數(shù)據(jù)是相等的
print(decompressed_data == original_data)
"""
True
"""
# 還可以拿到未解壓的數(shù)據(jù),顯然也是原始數(shù)據(jù)
print(decompressor.unused_data == original_data)
"""
True
"""

當(dāng)然,zlib 還支持驗(yàn)證數(shù)據(jù)完整性。

import zlib

original_data = b"komeiji satori is a cute girl" * 1024
# 計(jì)算 Adler-32 校驗(yàn)和
print(zlib.adler32(original_data))
"""
4170046071
"""
# 計(jì)算 CRC-32 校驗(yàn)和
print(zlib.crc32(original_data))
"""
2627291461
"""

以上就是 zlib 模塊的用法。

bz2 模塊

bz2 模塊和 zlib 的用法非常類似:

import bz2

original_data = b"komeiji satori is a cute girl" * 1024
# 也可以指定壓縮等級(jí),范圍 1 ~ 9,注意:zlib 是 0 ~ 9
compressed_data = bz2.compress(original_data, 5)
print(len(original_data))
"""
29696
"""
print(len(compressed_data))
"""
103
"""
print(bz2.decompress(compressed_data) == original_data)
"""
True
"""

也可以增量壓縮:

from io import BytesIO
import bz2

original_data = b"komeiji satori is a cute girl" * 1024
buffer = BytesIO()
buffer.write(original_data)
buffer.seek(0)

# 創(chuàng)建壓縮器,壓縮等級(jí)為 5
compressor = bz2.BZ2Compressor(5)
while (data := buffer.read(1024)) != b"":
    compressor.compress(data)
compressed_data = compressor.flush()
# 這里不需要額外補(bǔ)充頭部信息
decompressed_data = bz2.decompress(compressed_data)
print(original_data == decompressed_data)
"""
True
"""

也可以同時(shí)包含壓縮數(shù)據(jù)和未壓縮數(shù)據(jù):

import bz2

original_data = b"komeiji satori is a cute girl" * 1024
compressed_data = bz2.compress(original_data)
combined_data = compressed_data + original_data
# 創(chuàng)建一個(gè)解壓縮器
decompressor = bz2.BZ2Decompressor()
decompressed_data = decompressor.decompress(combined_data)
# 和原始數(shù)據(jù)是相等的
print(decompressed_data == original_data)  # True
# 還可以拿到未解壓的數(shù)據(jù),顯然也是原始數(shù)據(jù)
print(decompressor.unused_data == original_data)  # True
# 同樣要求壓縮數(shù)據(jù)在前

相比 zlib,bz2 還可以讀寫文件:

import os
import bz2

original_data = b"komeiji satori is a cute girl" * 1024
# 寫入文件
with bz2.open("1.bz2", "wb", compresslevel=9) as f:
    f.write(original_data)
# 讀取文件,判斷兩者是否相等
with bz2.open("1.bz2", "rb", compresslevel=9) as f:
    print(f.read() == original_data)  # True

os.unlink("1.bz2")

當(dāng)然我們使用內(nèi)置函數(shù) open 打開(kāi)文件,然后手動(dòng)寫入壓縮數(shù)據(jù)或者讀取數(shù)據(jù)再手動(dòng)解壓,也是可以的。

gzip 模塊

首先 gzip 只有全量壓縮,沒(méi)有增量壓縮。

import gzip

original_data = b"komeiji satori is a cute girl" * 1024
# 也可以指定壓縮等級(jí),范圍 0 ~ 9
compressed_data = gzip.compress(original_data, 5)
print(len(original_data)) 
"""
29696
"""
print(len(compressed_data)) 
"""
134
"""
print(gzip.decompress(compressed_data) == original_data)  
"""
True
"""

還可以調(diào)用 gzip.open 函數(shù):

import os
import gzip

original_data = b"komeiji satori is a cute girl" * 1024
# 寫入文件
with gzip.open("1.gz", "wb", compresslevel=9) as f:
    f.write(original_data)
# 讀取文件,判斷兩者是否相等
with gzip.open("1.gz", "rb", compresslevel=9) as f:
    print(f.read() == original_data)  #
    """
    True
    """

os.unlink("1.gz")

小結(jié)

以上就是 Python 壓縮數(shù)據(jù)所使用的三個(gè)模塊,之間是比較相似的。另外再補(bǔ)充一點(diǎn),一般將數(shù)據(jù)壓縮之后,會(huì)轉(zhuǎn)成 16 進(jìn)制進(jìn)行傳輸,舉個(gè)例子:

import binascii
import gzip

original_data = b"komeiji satori"
compressed_data = gzip.compress(original_data, 5)
# 轉(zhuǎn)成 16 進(jìn)制
hex_data = binascii.hexlify(compressed_data)
print(
    binascii.unhexlify(hex_data) == compressed_data
)  # True

還是比較簡(jiǎn)單的。

以上就是詳解Python如何實(shí)現(xiàn)壓縮與解壓縮數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于Python壓縮與解壓縮數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python pip 命令從入門到精通及最佳實(shí)踐

    Python pip 命令從入門到精通及最佳實(shí)踐

    pip是Python生態(tài)中不可或缺的工具,掌握它的各種命令和選項(xiàng)能夠極大提升開(kāi)發(fā)效率,本文從基礎(chǔ)命令到高級(jí)用法,再到配置和常見(jiàn)問(wèn)題,全面覆蓋了pip 的使用場(chǎng)景,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • 快速進(jìn)修Python指南之面向?qū)ο蟾呒?jí)篇

    快速進(jìn)修Python指南之面向?qū)ο蟾呒?jí)篇

    這篇文章主要為大家介紹了Java開(kāi)發(fā)者如何快速進(jìn)修Python指南之面向?qū)ο蟾呒?jí)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之knn算法pandas

    機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之knn算法pandas

    這篇文章主要為大家詳細(xì)介紹了機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之knn算法pandas,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • R語(yǔ)言屬性知識(shí)點(diǎn)總結(jié)及實(shí)例

    R語(yǔ)言屬性知識(shí)點(diǎn)總結(jié)及實(shí)例

    在本篇文章里小編給大家整理了一篇關(guān)于R語(yǔ)言屬性知識(shí)點(diǎn)總結(jié)及實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • Python使用DuckDB秒級(jí)處理超大Excel文件的終極指南

    Python使用DuckDB秒級(jí)處理超大Excel文件的終極指南

    你是否經(jīng)歷過(guò)這樣的絕望:雙擊打開(kāi)一個(gè) 500MB 的 Excel 文件,看著鼠標(biāo)光標(biāo)變成旋轉(zhuǎn)的圓圈,內(nèi)存占用飆升,最后屏幕變白顯示未響應(yīng),本文將手把手教你如何利用 DuckDB 輕松讀取、查詢和分析超大 Excel 文件,需要的朋友可以參考下
    2026-02-02
  • 使用Python編寫簡(jiǎn)單網(wǎng)絡(luò)爬蟲抓取視頻下載資源

    使用Python編寫簡(jiǎn)單網(wǎng)絡(luò)爬蟲抓取視頻下載資源

    從上一篇文章的評(píng)論中看出似乎很多童鞋都比較關(guān)注爬蟲的源代碼。所有本文就使用Python編寫簡(jiǎn)單網(wǎng)絡(luò)爬蟲抓取視頻下載資源做了很詳細(xì)的記錄,幾乎每一步都介紹給大家,希望對(duì)大家能有所幫助
    2014-11-11
  • Python實(shí)現(xiàn)上下文管理器的示例代碼

    Python實(shí)現(xiàn)上下文管理器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Python中實(shí)現(xiàn)上下文管理器的具體方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-07-07
  • pyqt5 lineEdit設(shè)置密碼隱藏,刪除lineEdit已輸入的內(nèi)容等屬性方法

    pyqt5 lineEdit設(shè)置密碼隱藏,刪除lineEdit已輸入的內(nèi)容等屬性方法

    今天小編就為大家分享一篇pyqt5 lineEdit設(shè)置密碼隱藏,刪除lineEdit已輸入的內(nèi)容等屬性方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • python 使用uiautomator2連接手機(jī)設(shè)備的實(shí)現(xiàn)

    python 使用uiautomator2連接手機(jī)設(shè)備的實(shí)現(xiàn)

    這篇文章主要介紹了python 使用uiautomator2連接手機(jī)設(shè)備的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • anaconda升級(jí)sklearn版本的實(shí)現(xiàn)方法

    anaconda升級(jí)sklearn版本的實(shí)現(xiàn)方法

    這篇文章主要介紹了anaconda升級(jí)sklearn版本的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評(píng)論

蒙阴县| 台北县| 江阴市| 富顺县| 南开区| 武强县| 舒兰市| 西盟| 包头市| 仙居县| 河北省| 东兰县| 安泽县| 崇阳县| 两当县| 遵义市| 沛县| 连平县| 遵义市| 葵青区| 卢龙县| 灵丘县| 泉州市| 若羌县| 蓬溪县| 东阳市| 晋城| 龙胜| 赤水市| 依兰县| 津南区| 江北区| 武山县| 同德县| 恩平市| 连江县| 交城县| 东平县| 融水| 社会| 铜梁县|