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

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

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

楔子

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

那么下面就開始吧。

zlib 模塊

看一下 zlib 模塊的用法。

import zlib

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

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


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

在壓縮的時候還可以指定壓縮級別:

import zlib

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

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

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

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

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)建壓縮器,壓縮等級為 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)行解壓,然后對比一下,看看和原始數(shù)據(jù)是否相等
# 注意:zlib 壓縮之后是有一個頭部信息的,否則會認(rèn)為數(shù)據(jù)不是 zlib 壓縮格式
# 但是增量壓縮會將頭部信息給去掉,所以解壓的時候還要手動加上
# 這個頭部信息是 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ù)混在一起,舉個例子:

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)建一個解壓縮器
decompressor = zlib.decompressobj()
# 對 combined_data 進(jìn)行解壓,只會得到對 compressed_data 解壓之后的數(shù)據(jù)
# 由于 zlib 會在壓縮數(shù)據(jù)前面加上一個頭部信息,所以 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 還支持驗證數(shù)據(jù)完整性。

import zlib

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

以上就是 zlib 模塊的用法。

bz2 模塊

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

import bz2

original_data = b"komeiji satori is a cute girl" * 1024
# 也可以指定壓縮等級,范圍 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)建壓縮器,壓縮等級為 5
compressor = bz2.BZ2Compressor(5)
while (data := buffer.read(1024)) != b"":
    compressor.compress(data)
compressed_data = compressor.flush()
# 這里不需要額外補充頭部信息
decompressed_data = bz2.decompress(compressed_data)
print(original_data == decompressed_data)
"""
True
"""

也可以同時包含壓縮數(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)建一個解壓縮器
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 打開文件,然后手動寫入壓縮數(shù)據(jù)或者讀取數(shù)據(jù)再手動解壓,也是可以的。

gzip 模塊

首先 gzip 只有全量壓縮,沒有增量壓縮。

import gzip

original_data = b"komeiji satori is a cute girl" * 1024
# 也可以指定壓縮等級,范圍 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ù)所使用的三個模塊,之間是比較相似的。另外再補充一點,一般將數(shù)據(jù)壓縮之后,會轉(zhuǎn)成 16 進(jìn)制進(jìn)行傳輸,舉個例子:

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

還是比較簡單的。

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

相關(guān)文章

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

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

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

    R語言屬性知識點總結(jié)及實例

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

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

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

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

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

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

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

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

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

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

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

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

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

    桃园县| 通许县| 龙江县| 芷江| 阳信县| 井研县| 玛曲县| 荃湾区| 高碑店市| 定西市| 井研县| 大同市| 扶风县| 黑龙江省| 兴业县| 满城县| 铜鼓县| 富顺县| 青神县| 苗栗市| 镇安县| 禄丰县| 廉江市| 宜兰市| 文昌市| 湄潭县| 昌邑市| 镶黄旗| 临沧市| 从江县| 洪江市| 岳普湖县| 沁水县| 普格县| 保山市| 厦门市| 合川市| 汪清县| 抚州市| 托克逊县| 无锡市|