提问人:William Flannery 提问时间:11/17/2023 最后编辑:William Flannery 更新时间:11/17/2023 访问量:39
Python - 删除最后一个 .zip 文件时出现 WinError 32
Python - WinError 32 when deleting last .zip file
问:
我正在尝试将 .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)
没有运气......
答:
0赞
Barmar
11/17/2023
#1
由于以下原因导致的问题
z = zipfile.ZipFile(download_path + '\\' + filename)
这永远不会被关闭。每次循环中,您都会重用该变量,因此垃圾回收器会自动关闭上一个 zip 文件。但最后一个永远不会关闭。
用
with zipfile.ZipFile(f) as z:
在代码部分周围使用,以便它自动关闭。z
评论
os.path.join()
for filename in os.listdir(download_path):