如何编写 if 语句来检查 zip 文件中的子目录,如果不存在,则创建一个新目录?

How do I write an if statement to check a zip file for a subdirectory and if that doesn't exist, creates a new directory?

所以正如标题中所说,我正在尝试编写一个分支 if/elif 来检查 zip 文件中的子目录,以确定我是否可以只提取子目录和文件,或者我是否需要创建一个它的新目录。这样做的目的是,我有很多漫画和图像档案,其中一些只包含图像,一些包含一个或多个子目录。所以我想自动化解档过程,将所有图像留在完全相同的目录结构中。到目前为止,我的代码如下所示:

if name.endswith('.zip'):
    
    zip_ref = zipfile.ZipFile(archive, 'r')

    # OS path splits the name away from the file extension and path variable
    new_folder = os.path.splitext(archive)[0][0:]

    zip_con = [zip_ref.namelist()]

    for f in zip_con[0]:
       if f.endswith('/'):
           try:
               zip_ref.extractall()
           except(OSError, IOError) as err:
               if err.errno != errno.EEXIST:
                   raise
           continue
    os.remove(archive)

这适用于具有子目录的文件,它提取子目录和图像,然后删除原始存档,但如果失败,它会自动删除存档而不提取任何内容。

我试图添加这样的内容:

else:
    os.mkdir(new_folder)
    zip_ref.extractall(new_folder)
    os.remove(archive)

还有:

elif not f.endswith('/'):
    os.mkdir(new_folder)
    zip_ref.extractall(new_folder)
    os.remove(archive)

但是由于 for 循环,它总是至少触发一次,所以如果一个 zip 文件有一个子目录,它最终会同时给我两个。仅子目录的一个副本和一个目录的副本以及子目录的另一个副本和嵌套在其中的图像。否则它会在到达 elif 并崩溃时立即失败。

编辑:目录和文件信息以及当前代码结果的清晰示例

因此,出于测试目的,我将所有 zip 文件都放在一个文件夹中,并使用 python 脚本。这是目前的结构,请注意“All-rounder_Meguru”压缩包不包含子目录,但“海贼王”压缩包包含子目录。

压缩结构

我的代码的当前结果: 未归档的文件

这会导致重复提取和完整命名的海贼王文件夹(例如海贼王 v06 (2005)(数字版)(AnHeroGold-Empire))也将包含“海贼王 V06”子目录,其中嵌套了图像。

当前,添加了 makedirs,就像评论中链接的示例一样。

 #Path to the archive
        archive = os.path.abspath(path)

        if name.endswith('.zip') or name.endswith('.cbz') or name.endswith('.ZIP') or name.endswith('.CBZ'):

            zip_ref = zipfile.ZipFile(archive, 'r')

            # OS path splits the name away from the file extension and path variable
            new_folder = os.path.splitext(archive)[0][0:]

            zip_con = [zip_ref.namelist()]

            for f in zip_con[0]:
                if f.endswith('/'):
                    try:
                        zip_ref.extractall()
                    except(OSError, IOError) as err:
                        if err.errno != errno.EEXIST:
                            raise
                    continue
                else:
                    try:
                        os.makedirs(new_folder)
                        zip_ref.extractall(new_folder)
                    except OSError as exc:
                        if exc.errno == errno.EEXIST and os.path.isdir(new_folder):
                            pass
            os.remove(archive)

经过长时间的休息并回到问题上,我发现只是我不太了解如何使用 python 中的东西,例如 continue、break 和 StopIteration。大概是问错问题太回头了。

在此处添加 'break' 解决了我所有的问题:

try:
   zip_ref.extractall()
   break