如何通过 Python 删除 Windows 中的 (g)zip 文件? (在 LabVIEW 中生成的文件。)

How do I delete a (g)zip file in Windows via Python? (File generated in LabVIEW.)

我有一些 zip 文件需要在 Python 中以编程方式删除 3. 我根本不需要先打开它们:我可以仅根据文件名来确定是否要删除它们.在扫描这个问题时,我注意到以下不令人满意的问题(不令人满意,因为我已经尝试了他们所有的方法都没有成功):

  1. 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)