使用Python (tarfile) 讀取和寫入tar存檔檔案


‘tar’ 實用程式最初是為 UNIX 作業系統引入的。其目的是將多個檔案收集到單個存檔檔案中,通常稱為 tarball,這使得分發檔案變得容易。Python 標準庫中的 tarfile 模組中的函式有助於根據需要建立 tar 存檔和從 tarball 中提取檔案。存檔可以使用 gzip、bz2 和 lzma 壓縮,也可以完全不壓縮。

此模組中定義的主要函式是 main(),使用它可以完成寫入 tar 檔案或從中讀取的操作。

Open()

此函式返回與作為引數提供給它的檔名相對應的 TarFile 物件。該函式需要另一個名為 mode 的引數,預設為 'r',表示不壓縮。其他模式如下所示:

序號模式及操作
1'r' 或 'r:*'
以透明壓縮方式開啟以進行讀取。
2'r:'
開啟以讀取,不壓縮。
3'r:gz'
開啟以使用 gzip 壓縮排行讀取。
4'r:bz2'
開啟以使用 bzip2 壓縮排行讀取。
5'r:xz'
開啟以使用 lzma 壓縮排行讀取。
6'x' 或 'x:'
獨佔建立 tar 檔案,不壓縮。
7'x:gz'
建立使用 gzip 壓縮的 tar 檔案。
8'x:bz2'
建立使用 bzip2 壓縮的 tar 檔案。
9'x:xz'
建立使用 lzma 壓縮的 tar 檔案。
10'a' 或 'a:'
開啟以進行追加,不壓縮。
11'w' 或 'w:'
開啟以進行無壓縮寫入。
12'w:gz'
開啟以進行 gzip 壓縮寫入。
13'w:bz2'
開啟以進行 bzip2 壓縮寫入。
14'w:xz'
開啟以進行 lzma 壓縮寫入。

該模組定義了 TarFile 類。可以呼叫建構函式來例項化 TarFile 物件,而不是 open() 函式。

TarFile()

此建構函式也需要檔名和 mode 引數。mode 引數的可能值如上所示。

此類中的其他方法如下:

add()

此方法將檔案新增到存檔中。該方法需要一個名稱,可以是檔案、目錄、符號連結、快捷方式等的名稱。預設情況下,目錄會遞迴新增。要防止遞迴新增,請將 recursive 引數設定為 False。

addfile()

此方法將 TarInfo 物件新增到存檔中。

extractall()

如果未明確提供其他路徑,此方法會將存檔的所有成員提取到當前路徑中。

extract()

此方法將指定的成員提取到給定的路徑,預設為當前路徑。

以下示例開啟一個使用 gzip 演算法進行壓縮的 tar 檔案,並在其中新增一個檔案。

>>> fp = tarfile.open("zen.tar.gz","w:gz")
>>> fp.add("zen.txt")
>>> fp.close()

假設 'zen.txt' 檔案存在於當前工作目錄中,它將被新增到 'zen.tar.gz' 檔案中。

以下程式碼從 tar 存檔中提取檔案,並提取所有檔案(在本例中只有一個檔案),並將它們放入當前資料夾中。為了驗證結果,您可以刪除或重新命名當前資料夾中的 'zen.txt'。

>>> fp = tarfile.open("zen.tar.gz","r:gz")
>>> fp.extractall()
>>> fp.close()

您會發現 'zen.txt' 檔案將出現在當前目錄中。

要建立一個包含當前目錄中所有檔案的 tar 檔案,請使用以下程式碼:

import tarfile, glob
>>> fp=tarfile.open('file.tar','w')
>>> for file in glob.glob('*.*'):
fp.add(file)
>>> fp.close()

命令列介面

tar 檔案的建立和提取可以透過命令列介面實現。例如,透過在命令視窗中執行以下命令,將 'lines.txt' 檔案新增到 tar 檔案中:

C:\python36 >python -m tarfile -c line.tar lines.txt

可以使用以下命令列選項。

-l 或 --list列出 tar 檔案中的檔案。
-c 或 --create從原始檔建立 tar 檔案。
-e 或 --extract如果未指定 output_dir,則將 tar 檔案提取到當前目錄。
-t 或 --test測試 tar 檔案是否有效。
-v 或 --verbose詳細輸出。

以下命令列將在當前目錄下的 newdir 資料夾中提取 line.tar。

C:\python36>python -m tarfile -e line.tar newdir/

以下命令列將列出 tar 存檔中的所有檔案。

C:\python36>python -m tarfile -l files.tar

本文介紹了 tarfile 模組中定義的類和函式。

更新於:2020年6月26日

3K+ 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.