Problem zipFile-Erstellung mit shutil

Code-Stücke können hier veröffentlicht werden.
Antworten
alex75
User
Beiträge: 2
Registriert: Mittwoch 15. Juni 2022, 14:49

# Package imports
import zipfile
from zipfile import ZipFile
import shutil
import subprocess
import os
from tkinter import filedialog
from tkinter import ttk
from tkinter import messagebox
from tkinter import *
from tkinter.filedialog import askopenfilenames

#
# anderer Code
#

def button_create_sel(self):
""" Creates a Zip-File from a folder """
# filename = "compressed"
format = "zip"
open_file = filedialog.askdirectory() # Returns opened path as str
# print(open_file)
path, filename = os.path.split(open_file)

print (filename)
print (path)
shutil.make_archive(filename, "zip", path)


Hallo zusammen,
ich habe folgendes Problem und freue mich über Antworten.
Ich habe eine GUI mit tkinter (Spyder 5.1.5) erstellt, möchte, dass ich mit einem Button einen Ordner auswählen kann, den ich dann im gleichen Ordnerpfad und mit gleichem Ordnernamen + ".zip"
ein Zip-Ordner erstellt. Das Programm läuft zwar, aber:
- der Zip-Ordner wird im Verzeichnis, in dem das *.py Programm läuft, abgespeichert und
- der Zip-Ordner wird vollgemüllt, obwohl ich zu Testzwecken nur ein Bild in dem zu "zippenden" Ordner hinterlegt hatte.
- Abbruch des Programmes über Dateimanager.

Ich bin nicht sehr erfahren und habe im Forum nichts darüber gefunden.
Über Rückmeldungen freue ich mich, vielen Dank schon im Voraus.

Grüße,

Alex
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

*-Importe benutzt man nicht, tkinter wird üblicherweise als `import tkinter as tk` importiert und alle Namen über tk.<abc> referenziert.
zipfile, ZipFile, subprocess, messagebox und ttk werden importiert aber nicht genutzt.
In `button_create_sel` wird `format` nicht benutzt.
Im Moment wählst Du ein Verzeichnis aus, die packst alles im übergeordneten Verzeichnis in eine Datei, dessen Name aus dem ausgewählten Verzeichnis besteht, aber dann ins aktuelle Arbeitsverzeichnis geschrieben wird.
Benutze keine kryptischen Abkürzungen, was ist ein `sel`?

Wenn ich Dich richtig verstanden habe, willst Du eigentlich das hier:

Code: Alles auswählen

    def create_archive(self):
        """ Creates a Zip-File from a folder """
        path = filedialog.askdirectory()
        shutil.make_archive(path + ".zip", "zip", path)
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Man kann `askdirectory()` auch mit Cancel abbrechen. Den Rückgabewert sollte man gesondert behandeln und sich nicht darauf verlassen, dass der in der Folge schon irgendwo zu einer Ausnahme führen wird. Bis dahin könnte schon eine leere ".zip"-Datei angelegt worden sein.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
alex75
User
Beiträge: 2
Registriert: Mittwoch 15. Juni 2022, 14:49

Hallo Blackjack und Sirius3,

top, danke der schnellen Rückmeldung funktioniert.
Um zu vermeiden, dass ein: file.zip.zip erstellt wird, hab ich im obigen Code von Sirius noch
von: shutil.make_archive(path + ".zip", "zip", path)
in: shutil.make_archive(path, "zip", path)
abgeändert.

Funktioniert Bestens, Danke euch!
Antworten