Hvordan sletter jeg en (g) zip-fil i Windows via Python? (Fil genereret i LabVIEW.)

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et par zip-filer, som jeg skal slette programmatisk i Python 3. Jeg behøver ikke at åbne dem først først: Jeg kan afgøre, om jeg vil slette dem udelukkende baseret på deres filnavn. Ved scanning af dette spørgsmål bemærker jeg følgende utilfredsstillende spørgsmål (utilfredsstillende, som jeg har forsøgt alle deres tilgange uden succes):



  1. Fjernelse af sti fra en zip-fil ved hjælp af python

  2. Python zipfile frigiver ikke zip-fil

  3. Kan ikke fjerne zip-filen efter unzipping

  4. os.remove () i Windows giver '[[Error 32]] bruges af en anden proces'



Navnlig kaldes close() -metoden eller åbner filen i en with -klausul , ikke den Windows-lås der er. Den enkleste MWE I kan drømme op er dette:


import os
file\_path = r'C:UsersakeisterDesktopTatsuro 1.2.0.zip'
os.remove(file\_path)


Denne kode producerer:


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'


Jeg får den samme fejl, hvis jeg prøver


import os
file\_path = r'C:UsersakeisterDesktopTatsuro 1.2.0.zip'
with open(file\_path) as f:
    f.close()
os.remove(file\_path)


eller


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)


eller


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)


Der er ingen kommandoprompt åben til skrivebordet, og der er ingen Windows Stifinder vindue åbent for skrivebordet.


Jeg formoder, at en del af mit problem er, at filerne kan være gzip-filer og ikke almindelige zip-filer. Jeg er ikke helt sikker på, hvem de er. Jeg genererede zip-filerne (i det mindste har de en .zip-udvidelse) i LabVIEW 2015 ved hjælp af de indbyggede zip-funktioner. Det er ikke klart fra LabVIEW-dokumentationen, hvilken form for kompression zip-funktionerne bruger.


Hvad er løsningen på mit problem? Tak på forhånd for din tid!

Bedste reference


Jeg mener, at løsningen er i at løse årsagen til den fejl, du får:


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'


Det ser ud til ikke at være så meget af et Python problem så meget som det ser ud til at være et Windows og/eller LabVIEW problem.


Det er den normale adfærd for en fil, der ikke kan slettes, hvis en anden proces har en lås på den. Så det er et must, at frigive låsen (som LabVIEW synes at have).


Jeg anbefaler at identificere LabVIEW PID og enten stoppe eller genstarte LABVIEW.


Du kan prøve at inkorporere https://null-byte.wonderhowto.com/forum/kill-processes-windows-using-python-0160688/eller https://github.com/cklutz/LockCheck (et Windows-baseret program, der identificerer filen låse). [14] [15]


Hvis du kan inkorporere enten i dit Python-program for at lukke eller genstarte låseprocessen, skal zip-filen være flytbar.

Andre referencer 1


For fuldstændighed vil jeg sende den kode, der fungerede (efter helt at lukke 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)