首頁 > 軟體

python tarfile壓縮包操作保姆級教學

2023-10-31 22:00:09

前言

上次寫部落格還在去年的8月底了,期間有了小寶,換工作等諸多事宜讓我踩坑採的起飛,時隔4個月,逐漸找回狀態。這篇的主題是python的第三方庫zipfile,因工作中要處理大量的壓縮包zip檔案,所以趁著自由時間整理輸出下,以提高下工作的愉悅感。

1、tarfile

這個工具可以幫我們解決 zip 壓縮包的建立、讀取、寫入、新增、列出內部所有的成員。更高效的處理壓縮包,已達到快速處理資料的目的。

入口1:tarfile.open(name=“sample.zip”)

tar = tarfile.open(name="sample.zip"),針對路徑名 name 返回 TarFile 物件。這個物件可以用來解壓所有、解壓出其中符合規則的檔案、新增、寫入等。

import tarfile
tar = tarfile.open("sample.zip") # or tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()

入口2:tarfile.is_tarfile(name)

tarfile.is_tarfile(name),判斷檔案是不是tar包,name為檔案的路徑

import tarfile
if tarfile.is_tarfile("./tartest/tar_1.tar"):
    print(1)

2、處理 open 後的 TarFile 物件

TarFile 物件可在 with 語句中作為上下文管理器使用。 當語句塊結束時它將自動被關閉。tarfile物件主要用來:

  • 生成歸檔的成員name
  • 生成歸檔的成員 tarnifo 物件
  • 判斷某檔案在不在歸檔中
  • 將歸檔成員的相信資訊打到介面上
  • 解壓整個tar包到指定目錄
  • 解壓tar包的某個檔案到指定目錄
  • 將歸檔中的一個成員提取為檔案tarinfo物件
  • 將指定目錄下的 jiao.txt 壓縮到指定目錄下的 tar 包,tar不存在則新建一個,存在,則替換裡面的內容
import tarfile
# if tarfile.is_tarfile("./tartest/tar_1.tar"):
#     print(1)
tar = tarfile.open("./tartest/tar_1.tar")
print("以 tarinfo 返回歸檔的成員:", tar.getmembers())
# 以 tarinfo 返回歸檔的成員: [<TarInfo 'tar_1' at 0x1a74e3c57c0>, <TarInfo 'tar_1/jiao.txt' at 0x1a74e3c5e80>]
print("以 名稱 返回歸檔的成員:", tar.getnames())
# 以 名稱 返回歸檔的成員: ['tar_1', 'tar_1/jiao.txt']
print("如果name在歸檔中找到,則返回True", tar.getmember(name = "tar_1/jiao.txt"))
# 如果name在歸檔中找到,則返回True <TarInfo 'tar_1/jiao.txt' at 0x1a74e3c5e80>
if tar.getmember(name="tar_1/jiao.txt"):
    print("找到了")
print("【將內容清單列印到 sys.stdout】", tar.list())
"""
?rwxrwxrwx 0/0          0 2023-02-03 23:37:40 tar_1/ 
?rwxrwxrwx 0/0         15 2023-02-03 23:37:56 tar_1/jiao.txt 
"""
tar.extractall(path="./new_tar_file/")
# 當前目錄下生成目錄 new_tar_file
tar.extract(member="tar_1/jiao.txt", path="./new_tar_file1/")
# 從歸檔中提取出一個成員放入指定目錄,預設當前目錄。大多數情況下使用 extractall()
print("【將歸檔中的一個成員提取為檔案物件】", tar.extractfile(member="tar_1/jiao.txt"))
# 【將歸檔中的一個成員提取為檔案物件】 <ExFileObject name='./tartest/tar_1.tar'>
# 將當前目錄下的 jiao.txt 壓縮到指定目錄下的 tar 包,tar不存在則新建一個,存在,則替換裡面的內容
tar1 = tarfile.open(name="./tartest/tar_3.tar", mode="w|")
tar1.add(name="./jiao.txt")
tar1.close()  # 關閉 tarfile 物件
# 暫不清楚的
"""
tar.addfile() 將 TarInfo 物件 tarinfo 新增到歸檔
tar.gettarinfo()  基於 os.stat() 的結果或者現有檔案的相同資料建立一個 TarInfo
"""

3、處理2中返回的 TarInfo 物件

TarInfo 物件代表 TarFile 中的一個檔案,除了會儲存所有必要的檔案屬性(例如檔案型別、大小、時間、許可權、所有者等),它還提供了一些確定檔案型別的有用方法。 此物件 並不 包含檔案資料本身(意思你拿不到txt文字裡面的資料)。

import tarfile
tar = tarfile.open("./tartest/tar_1.tar")
tarinfos = tar.getmembers()
for tarinfo in tarinfos:
    print("基於 TarInfo 物件建立一個字串緩衝區", i.tobuf())
    print(tarinfo.name, "tar包成員的名稱")
    print(tarinfo.size, "tar包成員的大小")
    print(tarinfo.mtime, "上次修改的時間")
    print(tarinfo.mode, "許可權位")
    print(tarinfo.type, "檔案型別")
    print(tarinfo.linkname, "目標檔名的名稱,該屬性僅在型別為 LNKTYPE 和 SYMTYPE 的 TarInfo 物件中存在")
    print(tarinfo.uid, tarinfo.gid, tarinfo.uname, tarinfo.gname)
    if tarinfo.isfile():
        print("如果 Tarinfo 物件為普通檔案則返回 True")
    if tarinfo.isdir():
        print("如果為目錄則返回 True")
    if tarinfo.issym():
        print("如果為符號連結則返回 True")
    if tarinfo.islnk():
        print("如果為硬連結則返回 True")
    # 還有其他不常用的,不深入研究了

4、範例

如何將整個 tar 歸檔提取到當前工作目

import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()

如何通過 TarFile.extractall() 使用生成器函數而非列表來提取一個 tar包成員的子集

import os
import tarfile
def py_files(members):
    for tarinfo in members:
    	# os.path.splitext(路徑) 用來分離檔名與拓展名
        if os.path.splitext(tarinfo.name)[1] == ".sql":
            yield tarinfo
tar = tarfile.open("sample.tar.gz")
tar.extractall(members=py_files(tar))
tar.close()

將一堆檔案壓縮成tar包:

import tarfile
tar = tarfile.open("sample.tar", "w")
for name in ["foo.txt", "bar.txt", "quux.txt"]:
    tar.add(name)
tar.close()

使用 with 語句將一堆檔案壓縮成tar包

import tarfile
with tarfile.open("sample.tar", "w") as tar:
    for name in ["foo", "bar", "quux"]:
        tar.add(name)

讀取一個 gzip 壓縮的 tar 包並顯示一些成員資訊

import tarfile
tar = tarfile.open("sample.tar.gz", "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()

建立一個歸檔並使用 TarFile.add() 中的 filter 形參來重置使用者資訊

import tarfile
def reset(tarinfo):
    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()

到此這篇關於python tarfile壓縮包操作保姆級教學的文章就介紹到這了,更多相關python tarfile內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com