指令碼語言系列 關於資料壓縮和存檔 Python

2021-09-12 08:00:20 字數 4820 閱讀 6276

提供簡答的介面來壓縮和解壓壓縮檔案,類似gnu程式gzip和gunzip。

資料壓縮由zlib模組提供。

注意:不支援由gzip和gunzip程式解壓縮的其他檔案格式,例如compress和pack生成的檔案格式。

import gzip

with gzip.open('./desktop/file.txt.gz','rb') as f:

file_content = f.read()

import gzip

content = b"lots of content here"

with gzip.open('./desktop/file.txt.gz','wb') as f:

file.write(content)

import gzip

import shutil

with open('./desktop/file.txt','rb') as f_in:

with gzip.open('./desktop/file.txt.gz','wb') as f_out:

shutil.copyfileobj(f_in,f_out)

import gzip

s_in = b"lots of content here"

s_out = gzip.compress(s_in)

提供了使用lzma壓縮演算法壓縮和解壓縮資料的類和功能,包括乙個檔案介面,支援xz實用程式使用的.xz和.lzma檔案以及原始壓縮流。

注意:lzmafile是非執行緒安全的,不像bz2.bz2file,需要使用鎖來保護它。

import lzma

with lzma.open('file.xz') as f:

file_content = f.read()

import lzma

data = b"insert data here"

with lzma.open('file.xz','w') as f:

f.write(data)

import lzma

data_in = b"insert data here"

data_out = lzma.compress(data_in)

import lzma

lzc = lzma.lzmacompressor()

out1 = lzc.compress(b"some data\n")

out2 = lzc.compress(b"another piece of data\n")

out3 = lzc.compress(b"even more data\n")

out4 = lzc.flush()

# 連線所有部分輸出

result = b"".join([out1,out2,out3,out4])

import lzma

with open('file.xz','wb') as f:

f.write(b'this data will not be compressed\n')

with lzma.open(f,'w') as lzf:

lzf.write(b'this *will* be compressed\n')

f.write(b『not compressed\n')

import lzma

my_filters = [

, ,]with lzma.open('file.xz','w',filters=my_filters) as f:

f.write(b"blah blah blah")

zip是常見的歸檔和壓縮標準。

zipfile提供用於建立,讀取,寫入,追加和列舉zip檔案的工具。

zipfile支援zip存檔中加密檔案的解密,但無法建立加密檔案。

注意:zip使用python解密而非c解密。

with zipfile('spam.zip','w') as myzip:

myzip.write('eggs.txt')

# 即使發生異常,myzip在with語句結束之後關閉

with zipfile('spam.zip','w') as myzip:

with myzip.open('eggs.txt') as myfile:

print(myfile.read())

zf = pyzipfile('myprog.zip')

def notests(s):

fn=os.path.basename(s)

return(not(fn=='test') or fn.startwith('test_'))

zf.writepy('myprog',filterfunc=notests)

命令列介面
# 列舉檔案到建立monty.zip

python -m zipfile -c monty.zip spam.txt eggs.txt

# 列舉目錄source_dir到建立monty.zip

python -m zipfile -c monty.zip source_dir/

# 解壓monty.zip到目標目錄target_dir

python -m zipfile -e monty.zip target_dir/

# 列舉monty.zip的檔案

python -m zipfile -l monty.zip

# 測試monty.zip的有效性

python -m zipfile -t monty.zip

tarfile可以讀取和寫入tar檔案,包括使用gzip,bz2和lzma壓縮的檔案。

示例

import tarfile

tar = tarfile.open("sample.tar.gz")

tar.extractall()

tar.close()

import os

import tarfile

def py_files(members):

for tarinfo in members:

if os.path.splitext(tarinfo.name)[1]=='.py':

yield tarinfo

tar = tarfile.open("smaple.tar.gz")

tar.extractall(members=py_files(tar))

tar.close()

import tarfile

tar = tarfile.open('sample.tar','w')

for name in ['foo','bar','quux']:

tar.add(name)

tar.close()

import tarfile

with tarfile.open('sample.tar','w') as tar:

for name in ['foo','bar','quux']:

tar.add(name)

import tarfile

tar = tarfile.open('sample.tar','r:gz')

for tarinfo in tar:

print(tarinfo.name, 'is',tarinfo.size,'bytes in size and is',end='')

if tarinfo.isreg():

print('a regular file.')

elif tarinfo.isdir():

print('a directory.')

else:

print('something else.')

tar.close()

import tarfile

def reset(trainfo):

tarinfo.uid = tarinfo.gid = 0

tarinfo.uname = tarinfo.gname='root'

return tarinfo

tar = tarfile.open('sample.tar.gz','w:gz')

tar.add('foo',filter=reset)

tar.close()

命令列工具
# 列舉檔案到建立monty.tar

python -m tarfile -c monty.tar spam.txt eggs.txt

# 列舉目錄source_dir到建立monty.tar

python -m tarfile -c monty.tar source_dir/

# 解壓monty.tar到目標目錄target_dir

python -m tarfile -e monty.tar target_dir/

# 列舉monty.tar的檔案

python -m tarfile -l monty.tar

# 測試monty.tar的有效性

python -m tarfile -t monty.tar

# 更多資訊

python -m tarfile -t monty.tar -v

關於指令碼語言

程式是給普通使用者使用的,指令碼是程式設計師使用的。處理特定工作,普通使用者使用特定的程式 也是程式設計師編寫的 這種程式實現的功能通常是比較通用的功能,因為程式設計師編寫乙個程式當然要考慮使用者的數量啊。但是,在工作中,我們會經常遇到一些重複性強,而又個性化的功能。而一般的程式無法滿足要求,這時對...

指令碼語言 shell指令碼

指令碼語言的特徵 指令碼語言 於批處理命令語言,但更接近於程式語言。與批處理命令語言的差別是,指令碼語言有變數和豐富的控制語句 與一般程式語言的差別是 指令碼語言變數的值主要是字串,語言的基本單位是命令 而程式語言變數主要是數值,語言的基本單位是表示式 指令碼語言一般是解釋執行的,速度低,但開發成本...

使用指令碼語言

dim myvar myvar hello world myvar 在這個例子中,option explicit語句強制所有的變數必須專門宣告。dim語句宣告了變數myvar。如果在使用變數前沒有宣告變數,vbscript就會給出執行時錯誤資訊 variable is undefined myvar...