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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过Python删除Windows中的(g)zip文件? (在LabVIEW中生成的文件。)相关的知识,希望对你有一定的参考价值。

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

  1. Removing path from a zip file using python
  2. Python zipfile doesn't release zip file
  3. Unable to remove zipped file after unzipping
  4. 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 中的行

如何从python中的unicode字符串中删除除数字和“,”之外的所有字符?

如何删除多维 Laravel 集合中的列?

如何删除 Python 中的错误路径字符?

45如何使用python删除一个文件?

python如何删除列表中的元素