成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你知道 Python 如何解壓縮數(shù)據(jù)嗎

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

楔子

當(dāng)數(shù)據(jù)量大的時(shí)候,自然而然想到的就是對數(shù)據(jù)進(jìn)行壓縮,下面來看看 Python 如何壓縮數(shù)據(jù)。這里主要介紹三個(gè)模塊,分別是 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í)候,壓縮之后反而會(huì)增大


# 對數(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ù)長度: {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
"""

壓縮級(jí)別越高,速度越慢,但壓縮之后的數(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)建壓縮器,壓縮等級(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)行解壓,然后對比一下,看看和原始數(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()
# 對 combined_data 進(jìn)行解壓,只會(huì)得到對 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 打開文件,然后手動(dòng)寫入壓縮數(shù)據(jù)或者讀取數(shù)據(jù)再手動(dòng)解壓,也是可以的。

gzip 模塊

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

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

還是比較簡單的。

責(zé)任編輯:武曉燕 來源: 古明地覺的編程教室
相關(guān)推薦

2023-03-29 08:59:59

Go壓縮包文檔

2023-12-21 07:30:36

PythonZipfileTarfile

2018-09-14 16:18:26

Linux壓縮文件應(yīng)用程序

2010-01-04 09:27:31

Linux壓縮解壓縮命令詳解

2010-03-05 09:50:37

Ubuntu ligh

2023-01-30 09:04:56

Linux命令unzip

2009-10-21 09:10:52

VB.NET壓縮

2011-07-27 16:26:42

iPhone 解壓 gzip

2010-06-24 10:42:42

Bzip2壓縮

2016-11-17 22:02:13

Linux壓縮及解壓縮

2024-09-11 16:56:39

2021-02-22 07:58:52

Linux壓縮解壓

2012-05-10 09:43:28

2010-06-24 09:29:02

Linux Bzip2

2011-08-15 14:07:53

Objective-C解壓縮ZIP文件

2024-12-03 00:38:37

數(shù)據(jù)湖存儲(chǔ)COS

2018-06-27 09:51:17

2009-07-08 16:10:36

Servlet和JSPJSP頁面

2021-02-19 07:59:21

數(shù)據(jù)埋點(diǎn)數(shù)據(jù)分析大數(shù)據(jù)

2024-03-08 13:33:08

PG數(shù)據(jù)安全
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 色本道| 一区二区三区中文字幕 | 97国产精品 | 毛片入口| 97精品国产一区二区三区 | 中文字幕二区 | 国色天香成人网 | 欧美三级三级三级爽爽爽 | 亚洲一区精品视频 | 曰韩一二三区 | 亚洲日本国产 | 久久狠狠| 亚洲精品成人av | 亚洲国产成人久久综合一区,久久久国产99 | 国产精品大全 | 91天堂网 | 韩国欧洲一级毛片 | 日韩中文字幕视频 | 中文字幕亚洲欧美日韩在线不卡 | 日韩伦理一区二区 | 亚洲乱码一区二区 | 日本精品久久久一区二区三区 | 国产色网 | 精品无码久久久久久久动漫 | 日韩免费一区 | 国产一区二区在线免费观看 | 一区二区三区四区av | 欧美一区二区三区在线播放 | 中文字幕在线免费视频 | 日韩成人精品一区二区三区 | 亚洲一二三区精品 | 久草新在线 | 久久午夜影院 | 欧美综合国产精品久久丁香 | 黄色一级毛片 | 超碰国产在线 | 国产一区二区三区亚洲 | www.狠狠操 | 成人a视频在线观看 | 国产亚洲一区在线 | av免费看在线 |