递归解压存档文件,将(文件名,提取的内容)存储在字典中。

11 浏览
0 Comments

递归解压存档文件,将(文件名,提取的内容)存储在字典中。

请帮我编写一个返回以下内容的函数:

dict("file1.txt": list(),
     "file2.txt": list(),
     "file3.txt": list(),
     "file4.txt": list())

输入为:

file.zip:
        outer\
        outer\inner1.zip:
                file1.txt
                file2.txt
        outer\inner2.zip:
                file3.txt
                file4.txt

我的尝试(下面的异常除外):

0
0 Comments

问题的原因是在原始代码中,当递归解压缩包时,没有正确关闭已解压缩的内部zip文件,导致可能会出现文件句柄泄漏和资源浪费的问题。另外,原始代码中没有处理内部zip文件的解压缩。

解决方法是修改代码,添加关闭内部zip文件的操作,并在解压缩内部zip文件时,使用递归的方法进行处理。具体的解决方法如下:

1. 首先,导入所需的库:os、shutil、tempfile和zipfile。

2. 创建一个函数unzip_recursively,接受一个参数parent_archive,表示要解压缩的父级zip文件。

3. 使用ZipFile打开父级zip文件,并将其赋值给变量parent_archive。

4. 创建一个空字典result,用于存储(文件名,解压缩内容)的键值对。

5. 使用tempfile模块创建一个临时目录,将其赋值给变量tmpdir。

6. 尝试执行以下操作,并在最后关闭临时目录:

a. 使用parent_archive.extractall()将父级zip文件的内容解压缩到临时目录tmpdir中。

b. 使用parent_archive.namelist()获取父级zip文件中的文件列表,将其赋值给变量namelist。

c. 对于namelist中的每个文件名name,执行以下操作:

i. 使用os.path.join()将临时目录tmpdir和文件名name连接起来,将其赋值给变量innerzippath。

ii. 使用ZipFile打开内部zip文件innerzippath,并将其赋值给变量inner_zip。

iii. 创建一个内部解压缩路径inner_extract_path,通过在innerzippath后添加'.content'来命名。

iv. 如果内部解压缩路径inner_extract_path不存在,则使用os.makedirs()创建该路径。

v. 使用inner_zip.extractall()将内部zip文件的内容解压缩到inner_extract_path中。

vi. 对于inner_zip.namelist()中的每个文件名inner_file_name,执行以下操作:

1) 使用os.path.join()将内部解压缩路径inner_extract_path和文件名inner_file_name连接起来,将其赋值给变量file_path。

2) 使用open()打开文件file_path,并读取其内容,将其赋值给result字典中的键inner_file_name对应的值。

vii. 在处理完内部zip文件后,关闭inner_zip。

d. 最后,使用shutil.rmtree()删除临时目录tmpdir及其所有内容。

7. 返回result字典。

8. 在主函数中,调用unzip_recursively函数,并传入要解压缩的zip文件的路径作为参数。

9. 使用print语句输出解压缩后的结果。

经过修改的代码现在可以正确地递归解压缩zip文件,并将解压缩后的文件名和内容存储在字典中。在处理完内部zip文件后,会正确关闭文件句柄,避免了资源泄漏和浪费的问题。

0
0 Comments

问题的出现原因是需要递归地解压缩归档文件,并将文件名和提取的内容存储在字典中。

解决方法是使用Python的zipfile库来进行解压缩操作。首先定义了一个名为extract_zip的函数,该函数接受一个输入的zip文件作为参数,并返回一个字典,其中键是文件名,值是提取的内容。在函数中,使用ZipFile类打开输入的zip文件,然后使用read方法读取其中的每个文件的内容,并将其存储在字典中。

接下来定义了一个名为extract_all的函数,该函数接受一个输入的zip文件作为参数,并返回一个字典,其中键是归档文件中的条目(即文件或文件夹),值是调用extract_zip函数提取的内容。在函数中,使用ZipFile类打开输入的zip文件,并使用namelist方法获取所有的条目列表。然后使用列表推导式,对于列表中的每个条目,判断其是否为zip文件,如果是则调用extract_zip函数提取内容,并将其存储在字典中。

这样,就实现了递归地解压缩归档文件,并将文件名和提取的内容存储在字典中的功能。

0