Python tarfile 圧縮パッケージ操作の乳母レベルのチュートリアル

TarFile クラスは tar アーカイブであり、ヘッダー ブロックとデータ ブロックを含むメンバー ブロックで構成されます。各メンバーは TarInfo オブジェクトの形式で記述されます。したがって、TarFile は TarInfo のシーケンスです。

序文

この記事のテーマは、Python のサードパーティ ライブラリですzipfile。作業では大量の圧縮 zip ファイルを処理するため、空き時間を利用して出力を整理し、作業の楽しみを向上させます。

1、tarファイル

このツールは、zip アーカイブ内のすべてのメンバーの作成、読み取り、書き込み、追加、およびリストを行うのに役立ちます。圧縮パッケージのより効率的な処理により、高速データ処理という目的が達成されました。

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

tar = tarfile.open(name="sample.zip")、パス名名の TarFile オブジェクトを返します。このオブジェクトは、すべての解凍、ルールを満たすファイルの解凍、追加、書き込みなどに使用できます。

1

2

3

4

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 はファイルのパスです。

1

2

3

import tarfile

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

    print(1)

2. TarFile オブジェクトを開いた後に処理します。

TarFile オブジェクトは、with ステートメントでコンテキスト マネージャーとして使用できます。ステートメントブロックが終了すると自動的に閉じられます。tarfile オブジェクトは主に次の目的で使用されます。

  • アーカイブメンバー名の生成
  • アーカイブされたメンバー tarnifo オブジェクトを生成する
  • ファイルがアーカイブ内にあるかどうかを確認する
  • アーカイブメンバーの信頼情報をインターフェースに出力します。
  • tar パッケージ全体を指定されたディレクトリに解凍します。
  • tar パッケージ内のファイルを指定したディレクトリに解凍します。
  • アーカイブ内のメンバーをファイル tarinfo オブジェクトとして抽出します
  • 指定ディレクトリのjiao.txtを指定ディレクトリのtarパッケージに圧縮します tarが存在しない場合は新規作成します 存在する場合は中身を置き換えます

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

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 内のファイルを表し、必要なすべてのファイル属性 (ファイル タイプ、サイズ、時間、アクセス許可、所有者など) を保存するだけでなく、ファイル タイプを判断するための便利なメソッドも提供します。このオブジェクトにはファイル データ自体は含まれません (つまり、テキスト テキスト内のデータを取得できません)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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 アーカイブ全体を現在の作業ディレクトリに抽出する方法

1

2

3

4

import tarfile

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

tar.extractall()

tar.close()

如何通过 TarFile.extractall() 使用生成器函数而非列表来提取一个 tar包成员的子集

1

2

3

4

5

6

7

8

9

10

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包:

1

2

3

4

5

import tarfile

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

for name in ["foo.txt", "bar.txt", "quux.txt"]:

    tar.add(name)

tar.close()

使用 with 语句将一堆文件压缩成tar包

1

2

3

4

import tarfile

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

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

        tar.add(name)

读取一个 gzip 压缩的 tar 包并显示一些成员信息

1

2

3

4

5

6

7

8

9

10

11

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 形参来重置用户信息

1

2

3

4

5

6

7

8

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压缩包操作保姆级教程的文章就介绍到这了。

点击拿去
50G+学习视频教程
100+Python初阶、中阶、高阶电子书籍

おすすめ

転載: blog.csdn.net/ai520wangzha/article/details/131245125