Tutorial de nivel de niñera de operación de paquete comprimido tarfile de Python

La clase TarFile es un archivo tar, que consta de bloques de miembros, que incluyen bloques de encabezado y bloques de datos. Cada miembro se describe en forma de un objeto TarInfo. Por lo tanto, TarFile es una secuencia de TarInfo.

prefacio

El tema de este artículo es la biblioteca de terceros de python zipfile. Debido a que en el trabajo se procesa una gran cantidad de archivos zip comprimidos, aprovecho el tiempo libre para organizar la salida para mejorar el placer del trabajo.

1, archivo tar

Esta herramienta puede ayudarnos a crear, leer, escribir, agregar y enumerar todos los miembros en archivos zip. El procesamiento más eficiente de paquetes comprimidos ha logrado el propósito de un procesamiento rápido de datos.

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

tar = tarfile.open(name="sample.zip"), devuelve un objeto TarFile para el nombre de ruta. Este objeto se puede usar para descomprimir todo, descomprimir archivos que cumplan con las reglas, agregar, escribir, etc.

1

2

3

4

import tarfile

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

tar.extractall()

tar.close()

Entrada 2:tarfile.is_tarfile(name)

tarfile.is_tarfile(name), para determinar si el archivo es un paquete tar, el nombre es la ruta del archivo

1

2

3

import tarfile

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

    print(1)

2. Procese el objeto TarFile después de abrir

Un objeto TarFile se puede usar como administrador de contexto en una declaración with. Se cerrará automáticamente cuando finalice el bloque de declaraciones. El objeto tarfile se utiliza principalmente para:

  • Generar nombre de miembro del archivo
  • generar objetos tarnifo miembros archivados
  • Determinar si un archivo está en el archivo
  • Imprima la información de confianza del miembro del archivo en la interfaz
  • Descomprima todo el paquete tar en el directorio especificado
  • Descomprima un archivo en el paquete tar en el directorio especificado
  • Extraiga un miembro en el archivo como un objeto tarinfo de archivo
  • Comprima el jiao.txt en el directorio especificado en el paquete tar en el directorio especificado. Si tar no existe, cree uno nuevo. Si existe, reemplace el contenido dentro

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

dieciséis

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. Procesar el objeto TarInfo devuelto en 2

Un objeto TarInfo representa un archivo en un TarFile y, además de almacenar todos los atributos de archivo necesarios (como el tipo de archivo, el tamaño, la hora, los permisos, el propietario, etc.), también proporciona algunos métodos útiles para determinar el tipo de archivo. Este objeto no contiene los datos del archivo en sí mismo (lo que significa que no puede obtener los datos en el texto txt).

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

dieciséis

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. Ejemplos

Cómo extraer todo el archivo tar al directorio de trabajo actual

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初阶、中阶、高阶电子书籍

Supongo que te gusta

Origin blog.csdn.net/ai520wangzha/article/details/131245125
Recomendado
Clasificación