Python - 删除最后一个 .zip 文件时出现 WinError 32

Python - WinError 32 when deleting last .zip file

提问人:William Flannery 提问时间:11/17/2023 最后编辑:William Flannery 更新时间:11/17/2023 访问量:39

问:

我正在尝试将 .zip 文件从“下载”文件夹导出到我的工作目录中。有些文件名重复,所以我已将其设置为重命名文件,使其不同,以免重叠。导出后,我希望它删除下载中的 .zip 文件,但最后一个 .zip 文件由于某种原因抛出“[WinError 32] 进程无法访问该文件,因为它正在被另一个进程使用:{完整文件路径}”我将不胜感激!

import os, shutil, time
import zipfile

def unzip(download_path, dir_path):
    num = 0
    bad_files = 0
    to_delete = []
    for filename in os.listdir(download_path):
        f = os.path.join(download_path, filename)
        if (filename == "desktop.ini"):
            pass
        elif filename.endswith(".zip"):
            i = 0
            z = zipfile.ZipFile(download_path + '\\' + filename)
            print(z.namelist()) 
            with zipfile.ZipFile(f, 'r') as zObject:
                zObject.extractall(path=dir_path)
                    
            split_file = z.namelist()[0].split('/')[i]
            print(split_file)
            
            time.sleep(1)
            try:
                os.rename(dir_path + '\\' + split_file, f'{dir_path}\\{filename[:6]}.zip_{split_file}')
            except:
                os.rename(dir_path + '\\' + split_file, f'{dir_path}\\error_duplicate_{split_file}')
                pass

            to_delete.append(f)
            i += 1
            print(f"File {num + 1}")

        elif filename.endswith(".crdownload"):
            print("error: " + filename)
            bad_files += 1
            print(f"File {num + 1}")
        else:
            shutil.move(f'{download_path}\\{filename}', f'{dir_path}\\{filename}')
            print(f"File {num + 1}")
        num += 1
        time.sleep(2)

        for file in to_delete:
            os.remove(file)

    print(f"Bad files: {bad_files}")

该程序运行良好,并且完全按照我想要的方式运行,直到最后一个文件抛出错误。 我尝试过关闭 .zip,但这没有任何作用,我假设因为我正在使用该子句。我也尝试过for循环zObject.close()with

for _ in range(3):
         if not to_delete:
             break

         for file in to_delete.copy():
             try:
                 os.remove(file)
             except PermissionError:
                 pass
             else:
                 to_delete.remove(file)

没有运气......

自动化 python-zipfile

评论

0赞 Barmar 11/17/2023
也许最后一个文件仍在下载过程中,因此下载应用程序正在使用它。
0赞 Barmar 11/17/2023
当你显然知道如何使用时,你为什么要使用字符串连接来创建路径?os.path.join()
0赞 William Flannery 11/17/2023
@Barmar,当此功能启动时,文件都已完成下载。不过,你对串联提出了一个很好的观点......不知道我为什么没有想到这一点......
0赞 Barmar 11/17/2023
脚本中的哪一行出现错误?请发布完整的回溯。
1赞 Barmar 11/17/2023
删除文件的循环不应位于循环内部。它应该是在循环完成后。for filename in os.listdir(download_path):

答:

0赞 Barmar 11/17/2023 #1

由于以下原因导致的问题

z = zipfile.ZipFile(download_path + '\\' + filename)

这永远不会被关闭。每次循环中,您都会重用该变量,因此垃圾回收器会自动关闭上一个 zip 文件。但最后一个永远不会关闭。

with zipfile.ZipFile(f) as z:

在代码部分周围使用,以便它自动关闭。z