如何通过Python删除Windows中的(g)zip文件? (在LabVIEW中生成的文件。)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过Python删除Windows中的(g)zip文件? (在LabVIEW中生成的文件。)相关的知识,希望对你有一定的参考价值。
我有一些zip文件,我需要在Python 3中以编程方式删除。我根本不需要先打开它们:我可以确定是否只想根据文件名删除它们。在扫描SO以寻找这个问题时,我注意到以下令人不满意的问题(不满意,因为我已经尝试了所有方法但没有成功):
- Removing path from a zip file using python
- Python zipfile doesn't release zip file
- Unable to remove zipped file after unzipping
- os.remove() in windows gives "[Error 32] being used by another process"
特别是,调用close()
方法或在with
子句中打开文件不会释放任何Windows锁定。我能想到的最简单的MWE是这样的:
import os
file_path = r'C:UsersakeisterDesktopTatsuro 1.2.0.zip'
os.remove(file_path)
此代码生成:
PermissionError: [WinError 32] The process cannot access the file because it
is being used by another process: 'C:\Users\akeister\Desktop\Tatsuro
1.2.0.zip'
如果我尝试,我会得到同样的错误
import os
file_path = r'C:UsersakeisterDesktopTatsuro 1.2.0.zip'
with open(file_path) as f:
f.close()
os.remove(file_path)
要么
import gzip
import os
file_path = r'C:UsersakeisterDesktopTatsuro 1.2.0.zip'
with gzip.GzipFile(file_path) as f:
f.close()
os.remove(file_path)
要么
import zipfile
import os
zipped_file = r'C:UsersakeisterDesktopTatsuro 1.2.0.zip'
with zipfile.ZipFile(zipped_file) as zip_file:
for member in zip_file.namelist():
filename = os.path.basename(member)
if not filename:
continue
source = zip_file.open(member)
os.remove(zipped_file)
没有命令提示打开桌面,并且没有Windows资源管理器窗口打开到桌面。
我怀疑我的部分问题是文件可能是gzip文件,而不是常规的zip文件。我不完全确定它们是谁。我在LabVIEW 2015中使用内置的zip函数生成了zip文件(至少它们有.zip扩展名)。从LabVIEW文档中可以看出zip函数使用哪种压缩方式。
我的问题有什么解决方案?在此先感谢您的时间!
我相信解决方案是解决您得到的错误的根本原因:
PermissionError: [WinError 32] The process cannot access the file because it
is being used by another process: 'C:\Users\akeister\Desktop\Tatsuro
1.2.0.zip'
它似乎不是一个Python问题,就像它似乎是一个Windows和/或LabVIEW问题。
如果另一个进程锁定了文件,则无法删除文件的正常行为。因此,释放锁(看起来LabVIEW仍然持有)是必须的。
我建议识别LabVIEW PID并停止或重新启动LABVIEW。
您可以尝试合并https://null-byte.wonderhowto.com/forum/kill-processes-windows-using-python-0160688/或https://github.com/cklutz/LockCheck(一种基于Windows的程序,用于识别文件锁)。
如果您可以将任一项合并到Python程序中以关闭或重新启动锁定过程,则zip文件应该是可移除的。
为了完整起见,我将发布有效的代码(在完全关闭LabVIEW之后):
import shutil
import os
import tkinter as tk
""" ----------------- Get delete_zip_files variable. --------------- """
delete_zip_files = False
root= tk.Tk() # create window
def delete_button():
global delete_zip_files
delete_zip_files = True
root.destroy()
def leave_button():
global delete_zip_files
delete_zip_files = False
root.destroy()
del_button = tk.Button(root, text='Delete Zip Files',
command=delete_button)
del_button.pack()
lv_button = tk.Button(root, text='Leave Zip Files',
command=leave_button)
lv_button.pack()
root.mainloop()
print(str(delete_zip_files))
""" ----------------- List files in user's desktop. ---------------- """
# Desktop path is os.path.expanduser("~/Desktop")
# List contents of a directory: os.listdir('directory here')
desktop_path = os.path.expanduser("~/Desktop")
for filename in os.listdir(desktop_path):
if filename.startswith('Tatsuro') or
filename.startswith('TestScript'):
# Get full path to file.
file_path = os.path.join(desktop_path, filename)
if filename.endswith('2015'):
# It's a folder. Empty the folder, then delete the folder:
shutil.rmtree(file_path)
if filename.endswith('.zip'):
# Get desired folder name.
target_folder_name = filename.split('.zip')[0]
target_folder_path = os.path.join(desktop_path,
target_folder_name)
# Now we process. Unzip and delete.
shutil.unpack_archive(file_path, target_folder_path)
if delete_zip_files:
# Now we delete if the user chose that.
os.remove(file_path)
以上是关于如何通过Python删除Windows中的(g)zip文件? (在LabVIEW中生成的文件。)的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 C# 中的 ListView for Windows 8 应用程序删除 SQLite 中的行