Python | 不会用 Python tar 打包解包?一招解决!(含代码)

原创声明

本文为 HinGwenWoong 原创,如果这篇文章对您有帮助,欢迎转载,转载请阅读文末的【授权须知】,感谢您对 HinGwenWoong 文章的认可!


前言

深度学习的前期需要整理大量的训练数据,这些数据往往需要传输,大量数据集上传速度超级慢,直接使用代码打 tar 包,速度蹭蹭蹭上去

在网上甚至官网也找不到适合我自己的打包解包方式,要不是只能指定文件目录直接打包,这导致我看不能加进度条,无法得知具体的进度;要不就是打包之后的结构是从根目录开始,解压之后层级变得超级深,最终,被我找到了适合我自己的方法,下面就献上我的终极解决方法。

我是 HinGwenWoong,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!


一、tar 是什么?

tarUnix和类Unix系统上的归档打包工具,可以将多个文件合并为一个文件,打包后的文件名亦为tar。目前,tar文件格式已经成为POSIX标准,最初是POSIX.1-1988,目前是POSIX.1-2001。本程序最初的设计目的是将文件备份到磁带(tape archive)上,因而得名tar

tar文件仅用于存储数据,而不用于压缩,其由一系列文件对象组成,每个文件对象都包含任何文件的数据,并以 512 字节的头记录开头。文件数据按原样写入,但其长度舍入为512字节的倍数。最初的tar实现并不关心填充字节的内容,并保留了缓冲区数据不变,但是大多数现代tar实现都用0填充了额外的空间。归档的结尾至少由两个连续的0填充记录标记。文件的最后一块被填充为全0tar记录大小的来源似乎是在Version 7 Unix文件系统中使用的512字节磁盘扇区。


二、上代码

1. tar 打包

  • 原始文件目录:
data/
├── 1.png
├── 2.png
├── 3.png
└── sub_dir
    ├── sub_1.png
    ├── sub_2.png
    └── sub_3.png
  • 代码:
# -*- coding:utf-8 -*-
"""
@author: HinGwenWoong
@contact: peterhuang0323@qq.com
@brief: Using python handle tar
"""
import glob
import tarfile
from pathlib import Path
from tqdm import tqdm

def pack_to_tar(source_dir: Path):
    """
    将 文件夹 打包成 tar
    :param source_dir: 需要打包的文件路径
    :return:
    """

    if not source_dir.is_dir():
        raise NotADirectoryError("Need directory for tar packing.")

    print(f"Making tar for {source_dir}, pls wait...")
    tar_file_path = source_dir.with_suffix(".tar")
    file_count = len(glob.glob(pathname=str(source_dir.joinpath("*"))))

    with tarfile.open(tar_file_path, "w") as tar:
        with tqdm(total=file_count) as p_bar:
            for image_file in source_dir.iterdir():
                p_bar.update(1)
                tar.add(image_file, str(image_file.name))
                
    print(f"pack tar done! Local at {tar_file_path}")


if __name__ == "__main__":
    dir_path = Path(r"Your dir path")
    pack_to_tar(dir_path)

  • 完成
    在这里插入图片描述

  • tar 包的文件预览:

data.tar
├── 1.png
├── 2.png
├── 3.png
└── sub_dir
    ├── sub_1.png
    ├── sub_2.png
    └── sub_3.png

2. tar 解包

# -*- coding:utf-8 -*-
"""
@author: HinGwenWoong
@contact: peterhuang0323@qq.com
@brief: Using python handle tar
"""
import glob
import tarfile
from pathlib import Path
from tqdm import tqdm

def unpack_tar(source_tar: Path):
    """
    将 tar 解包
    :param source_tar: 需要解包的 tar 文件路径
    :return:
    """

    if not source_tar.suffix == ".tar":
        raise NotADirectoryError("Need tar for tar unpacking.")

    dst_dir = source_tar.with_suffix("")
    dst_dir.mkdir()

    with tarfile.open(source_tar) as tar:
        file_list = tar.getnames()
        with tqdm(total=len(file_list)) as p_bar:
            for file in file_list:
                p_bar.update(1)
                tar.extract(file, dst_dir)

    print(f"Unpack tar done! Local at {dst_dir}")


if __name__ == "__main__":
    dir_path = Path(r"Your dir path")
    unpack_tar(dir_path)

完成!
在这里插入图片描述


总结

以上就是如何使用 Python 打包和解包 tar 的教程,希望能够助力您的文件传输。

我是 HinGwenWoong,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!


授权须知

  1. 原创文章在推送一天后才可进行转载
  2. 转载文章,禁止声明原创
  3. 不允许直接二次转载,转载请根据原文链接联系作者
  4. 若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
    但对于未注明转载来源/原文链接的文章,我将保留追述的权利。

    作者:HinGwenWoong
    一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,共同进步!
    CSDN: HinGwenWoong
    原文链接:Python | 不会用 Python 打 tar 包?一招解决!(含代码)

  5. 若需要修改文章的排版,请根据原文链接联系作者
  6. 再次感谢您的认可,转载请遵守如上转载须知!

参考

[1] tar (computing)

更多阅读推荐
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值