背景

本题目想实现递归解压并对压缩包内的数字求和。 本题目来自中国科学院大学,算法概论课后作业02 源文件 。

Exercise (2).

定义文件xx.tar.gz 的产生方式如下:

  • 以xx 为文件名的文件通过tar 和gzip 打包压缩产生,该文件中以字符串的方式记录 了一个非负整数;
  • 或者以xx 为名的目录通过tar 和gzip 打包压缩产生,该目录中包含若干xx.tar.gz。 其中,x 2 [0, 9]。
    现给定一个根据上述定义生成的文件00.tar.gz (该文件从课程网站 下载),请确定其中包含的以xx 为文件名的文件个数以及这些文件中所记录的非负整数之和。

00.tar.gz 下载链接:https://download.csdn.net/download/still_night/10820211

代码实现(Python)

import os,tarfile

def unpack_path_file(pathname):
    archive = tarfile.open(pathname, 'r:gz')
    path=os.path.split(os.path.abspath(pathname))[0]
    f,n=0,0 # 设置文件数和加和为0
    for tarinfo in archive:
        archive.extract(tarinfo, path)   # 解压压缩文件中的一个文件
        name=tarinfo.name # 解压的文件名
        tfname=os.path.join(path,tarinfo.name) # 解压后的文件路径
        if tarinfo.isfile(): # 如果是文件 存在待解压文件是.的情况 表示当前压缩文件
            if tarinfo.name.rfind(".tar.gz")!=-1: # 如果也是压缩文件,则递归解压它
                f1,n1=unpack_path_file(tfname)
                f+=f1
                n+=n1
                # 把调用函数的文件数量和数字和加上来
            else: # 如果不是压缩文件,则是数据文件,里面含有非负整数
                f+=1 # 文件数量加1
                with open(tfname) as fp:  # 读出来这个非负整数并加到n上
                    n+=int(fp.read())
    archive.close() # 关闭这个压缩文件
    return f,n  # 返回给上一级文件数量和加和
# 调用函数开始解压
unpack_path_file("00.tar.gz")

结果

  • 文件数:3170
  • 加和:15752491