0

我有一个用于提取过程的代码。首先,我为 zip 文件制作了它,但我发现我也有 rar 文件。所以,我安装了 rarfile 库并实现了提取过程。

但是,该代码似乎引发了异常,因为扫描的第一个文件是 .zip 文件。这解释了,我猜,为什么我有这个错误:

raise NotRarFile("Not a Rar archive: "+self.rarfile)
NotRarFile: Not a Rar archive: /Users/me/Downloads/_zips/test2/Break_The_Bans_-_Covers__B-sides.zip

提取代码如下:

for ArchivesFiles in chemin_zipfiles :    
        truncated_file = os.path.splitext(os.path.basename(ArchivesFiles))[0]
        if not os.path.exists(truncated_file):
            os.makedirs(truncated_file)
            rar_ref = rarfile.RarFile(ArchivesFiles,'r')
            zip_ref = zipfile.ZipFile(ArchivesFiles,'r')
            new_folder = os.path.realpath(truncated_file)
            rar_ref.extractall(new_folder)
            zip_ref.extractall(new_folder)

在调用此代码之前,我检索了所有带有 .zip 和 .rar 扩展名的文件:

chemin_zipfiles = [os.path.join(root, name)
             for root, dirs, files in os.walk(directory)
             for name in files
             if name.endswith((".zip", ".rar"))]

那我怎么能在同一个过程和功能中解压缩和解压缩呢?我哪里错了?非常感谢

4

1 回答 1

2

为什么不能简单地检查扩展名?像这样:

for ArchivesFiles in chemin_zipfiles :    
    truncated_file, ext = os.path.splitext(os.path.basename(ArchivesFiles)) 
    if not os.path.exists(truncated_file):
        os.makedirs(truncated_file)
        if ext == 'rar':
            arch_ref = rarfile.RarFile(ArchivesFiles,'r')
        else:
            arch_ref = zipfile.ZipFile(ArchivesFiles,'r')
        new_folder = os.path.realpath(truncated_file)
        arch_ref.extractall(new_folder)

请不要改变,你会得到一个truncated_file变量。

另一种可能会使以后的事情变得更容易,可能是这样的:

funcs = {'.rar':rarfile.RarFile, '.zip':zipfile.ZipFile}

for ArchivesFiles in chemin_zipfiles :    
    truncated_file, ext = os.path.splitext(os.path.basename(ArchivesFiles)) 
    if not os.path.exists(truncated_file):
        os.makedirs(truncated_file)
        arch_ref = funcs[ext](ArchivesFiles,'r')
        new_folder = os.path.realpath(truncated_file)
        arch_ref.extractall(new_folder)
于 2013-09-03T13:40:39.417 回答