如何使用zipfile更改目录?

2024-09-22 14:37:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以看到关于zipfile的一般性问题,不确定我是否遗漏了关于我的特定问题的一些内容(但我觉得这是一个显而易见的问题,如果它存在的话,我很抱歉)

我有一个包含多个目录的zip文件,我想在zipfile中cd,然后处理这些文件

我有以下代码:

with ZipFile(input_path, 'r') as zip:
  for f in zip.namelist():
    zinfo = zip.getinfo(f)
    if(zinfo.is_dir()):
       print(f)

其中打印:

dir1/
dir1/dir2
dir1/dir2/dir3

我现在只想从cddir3处理文件,而不解压缩整个zipfile

有人能告诉我做这个的代码吗

更新1:根据建议,我尝试了以下方法:

  with ZipFile(input_path, 'r') as zip: 
    for f in zip.namelist():
      zinfo = zip.getinfo(f)
      if(zinfo.is_dir()):
        if zinfo.filename == 'dir1/dir2/dir3':
          zip2 = zip.open(zip.path('dir1/dir2/dir3'))
          for f2 in zip2:
            zinfo2 = zip.getinfo(f2)
            print(zinfo2)

没有错误,但没有打印任何内容(但目录中肯定有文件,当我手动解包zip时可以看到这一点)


Tags: 文件pathin目录内容forifcd
1条回答
网友
1楼 · 发布于 2024-09-22 14:37:48

据我所知,你不能在zipfile中cd。但是,这里有一种方法可以在一个目录中找到一个子目录,并遍历其中的文件。下面的代码使用名为find_target_dir()的递归帮助函数来定位目标子文件夹,然后迭代并打印其中文件的名称

import os
from zipfile import ZipFile, Path as ZipPath


def find_target_dir(sub_directory, target_dir_name):
    for member in sub_directory.iterdir():
        if member.is_dir():
            return(member if member.name == target_dir_name else
                   find_target_dir(member, target_dir_name))

def get_zipfile_dir_members(input_path, target_dir_name):
    with ZipFile(input_path, 'r') as zfile:
        root_path = ZipPath(zfile)
        target_dir = find_target_dir(root_path, target_dir_name)
        if target_dir:
            print(f'Files in {target_dir}:')
            for file_name in target_dir.iterdir():
                if file_name.is_file():
                    print(f'    {file_name.name}')


get_zipfile_dir_members('./test_archive.zip', 'dir3')

带有测试存档文件的示例输出,该文件具有与您的问题中描述的子目录类似的子目录,此外,为了测试目的,我在每个级别添加了一个或多个常规文件

下面的列表显示了test_archive.zip文件中的内容:

contents of test archive

以下是脚本的打印输出:

Files in ./test_archive.zip/dir1/dir2/dir3/:
    d3_1.txt
    d3_2.txt
    d3_3.txt

相关问题 更多 >