如何通过 Python 删除 Windows 中的 (g)zip 文件? (在 LabVIEW 中生成的文件。)
How do I delete a (g)zip file in Windows via Python? (File generated in LabVIEW.)
我有一些 zip 文件需要在 Python 中以编程方式删除 3. 我根本不需要先打开它们:我可以仅根据文件名来确定是否要删除它们.在扫描这个问题时,我注意到以下不令人满意的问题(不令人满意,因为我已经尝试了他们所有的方法都没有成功):
- Removing path from a zip file using python
特别是,调用 close()
方法或在 with
子句中打开文件 不会释放任何 Windows 锁. 我能想到的最简单的 MWE 是这样的:
import os
file_path = r'C:\Users\akeister\Desktop\Tatsuro 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:\Users\akeister\Desktop\Tatsuro 1.2.0.zip'
with open(file_path) as f:
f.close()
os.remove(file_path)
或
import gzip
import os
file_path = r'C:\Users\akeister\Desktop\Tatsuro 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:\Users\akeister\Desktop\Tatsuro 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 Explorer window。
我怀疑我的部分问题是文件 可能是 gzip 文件,而不是常规的 zip 文件。我不完全确定它们是哪一个。我使用内置的 zip 函数在 LabVIEW 2015 中生成了 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 and/or LabVIEW 问题。
如果另一个进程锁定了某个文件,则无法删除该文件是正常现象。因此,必须释放锁(LabVIEW 似乎仍在持有)。
我建议识别 LabVIEW PID 并停止或重新启动 LABVIEW。
您可以尝试合并 https://null-byte.wonderhowto.com/forum/kill-processes-windows-using-python-0160688/ or https://github.com/cklutz/LockCheck(一个基于 Windows 的程序,用于识别文件锁)。
如果您可以将其合并到 Python 程序中以关闭或重新启动锁定过程,则 zip 文件应该是可移动的。
为了完整起见,我将 post 有效的代码(在完全关闭 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)
我有一些 zip 文件需要在 Python 中以编程方式删除 3. 我根本不需要先打开它们:我可以仅根据文件名来确定是否要删除它们.在扫描这个问题时,我注意到以下不令人满意的问题(不令人满意,因为我已经尝试了他们所有的方法都没有成功):
- Removing path from a zip file using python
特别是,调用 close()
方法或在 with
子句中打开文件 不会释放任何 Windows 锁. 我能想到的最简单的 MWE 是这样的:
import os
file_path = r'C:\Users\akeister\Desktop\Tatsuro 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:\Users\akeister\Desktop\Tatsuro 1.2.0.zip'
with open(file_path) as f:
f.close()
os.remove(file_path)
或
import gzip
import os
file_path = r'C:\Users\akeister\Desktop\Tatsuro 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:\Users\akeister\Desktop\Tatsuro 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 Explorer window。
我怀疑我的部分问题是文件 可能是 gzip 文件,而不是常规的 zip 文件。我不完全确定它们是哪一个。我使用内置的 zip 函数在 LabVIEW 2015 中生成了 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 and/or LabVIEW 问题。
如果另一个进程锁定了某个文件,则无法删除该文件是正常现象。因此,必须释放锁(LabVIEW 似乎仍在持有)。
我建议识别 LabVIEW PID 并停止或重新启动 LABVIEW。
您可以尝试合并 https://null-byte.wonderhowto.com/forum/kill-processes-windows-using-python-0160688/ or https://github.com/cklutz/LockCheck(一个基于 Windows 的程序,用于识别文件锁)。
如果您可以将其合并到 Python 程序中以关闭或重新启动锁定过程,则 zip 文件应该是可移动的。
为了完整起见,我将 post 有效的代码(在完全关闭 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)