題目2:遞歸解壓縮文件,並計算壓縮包中的全部文件內保存的數字之和

1、題目python

定義文件 xx.tar.gz 的產生方式以下:函數

  • 以 xx 爲文件名的文件經過 tar 和 gzip 打包壓縮產生,該文件中以字符串的方式記錄了一個非負整數;spa

  • 或者以 xx 爲名的目錄經過 tar 和 gzip 打包壓縮產生,該目錄中包含若干名如 xx.tar.gz 的壓縮包。code

其中 xx 即 00、0一、0二、03 這樣的數字。現給定一個根據上述定義生成的文件 00.tar.gz,請肯定其中包含的以xx 爲文件名的文件個數以及這些文件中所記錄的非負整數之和。遞歸

一個按此規則生成的文件 00.tar.gz 的下載地址:http://pan.baidu.com/s/1mgBpurQip

2、分析字符串

本題利用了遞歸的方法對壓縮包 00.tar.gz 及其下子壓縮包進行解壓縮後讀取文件get

3、代碼class

import os
import tarfile
import time

time_start = time.time()

#解壓縮函數
def unpack_path_file(parentdir, file_name):
    archive = tarfile.open(parentdir + "/" + file_name, "r:gz")
    for tarinfo in archive:
        archive.extract(tarinfo, parentdir)
    archive.close()

#初始目錄
root_dir = "temp"
#結果值
result = 0

#檢查目錄
def search_folder(parent_dir):

    global result
    #print("檢查目錄:" + parent_dir)

    #解壓縮全部可解壓文件
    for file_name in os.listdir(parent_dir):
        #print(file_name)
        if os.path.isfile(parent_dir + "/" + file_name) and file_name.find(".tar.gz") != -1:
            #print("解壓縮壓縮包:" + parent_dir + "/" + file_name)
            unpack_path_file(parent_dir, file_name)

    #計算全部解壓後文件內容
    for file_name in os.listdir(parent_dir):
        if os.path.isfile(parent_dir + "/" + file_name) and file_name.find(".tar.gz") == -1:
            #print("讀取文件:" + parent_dir + "/" + file_name)
            temp_file = open(parent_dir + "/" + file_name)
            number = temp_file.read()
            temp_file.close()
            result = result + int(number)
            #print("讀取到的數字:" + number + ";數字總和:" + str(result))

    #進入子目錄繼續
    for dir_name in os.listdir(parent_dir):
        if os.path.isdir(parent_dir + "/" + dir_name): 
            #print("搜索目錄:" + parent_dir + "/" + dir_name)
            search_folder(parent_dir + "/" + dir_name)

search_folder(root_dir)

#輸出結果
time_finish = time.time()
time_span = time_finish - time_start
#print("一" * 10)
print("計算結果:" + str(result))
print("共計用時:%.2f" % time_span)

4、運行結果import

如下是該段代碼在Python3.4.2中的運行結果:

END

相關文章
相關標籤/搜索