原创声明
本文为 HinGwenWoong 原创,如果这篇文章对您有帮助,欢迎转载,转载请阅读文末的【授权须知】,感谢您对 HinGwenWoong 文章的认可!
前言
深度学习的前期需要整理大量的训练数据,这些数据往往需要传输,大量数据集上传速度超级慢,直接使用代码打 tar
包,速度蹭蹭蹭上去!
在网上甚至官网也找不到适合我自己的打包解包方式,要不是只能指定文件目录直接打包,这导致我看不能加进度条,无法得知具体的进度;要不就是打包之后的结构是从根目录开始,解压之后层级变得超级深,最终,被我找到了适合我自己的方法,下面就献上我的终极解决方法。
我是 HinGwenWoong,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!
一、tar 是什么?
tar
是Unix
和类Unix
系统上的归档打包工具,可以将多个文件合并为一个文件,打包后的文件名亦为tar
。目前,tar
文件格式已经成为POSIX
标准,最初是POSIX.1-1988
,目前是POSIX.1-2001
。本程序最初的设计目的是将文件备份到磁带(tape archive)
上,因而得名tar
。
tar
文件仅用于存储数据,而不用于压缩,其由一系列文件对象组成,每个文件对象都包含任何文件的数据,并以 512
字节的头记录开头。文件数据按原样写入,但其长度舍入为512
字节的倍数。最初的tar
实现并不关心填充字节的内容,并保留了缓冲区数据不变,但是大多数现代tar
实现都用0
填充了额外的空间。归档的结尾至少由两个连续的0
填充记录标记。文件的最后一块被填充为全0
。tar
记录大小的来源似乎是在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,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!
授权须知
- 原创文章在推送一天后才可进行转载
- 转载文章,禁止声明原创
- 不允许直接二次转载,转载请根据原文链接联系作者
- 若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
但对于未注明转载来源/原文链接的文章,我将保留追述的权利。作者:HinGwenWoong
一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,共同进步!
CSDN: HinGwenWoong
原文链接:Python | 不会用 Python 打 tar 包?一招解决!(含代码) - 若需要修改文章的排版,请根据原文链接联系作者
- 再次感谢您的认可,转载请遵守如上转载须知!
参考
[1] tar (computing)