Problem mit einem Zip Archiv

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
FynnDE
User
Beiträge: 6
Registriert: Dienstag 2. Juni 2020, 14:03

Moin
Hab ein eigentlich ziemlich dämliches Problem und zwar versuche ich einfach nur ein Zip Archiv zu erstellen(klappt auch super), aber eine txt Datei darin zu speichern führt dazu, dass das Zip Archiv "ungültig" wird und nicht mehr geöffnet werden kann. Den compress type zipfile.ZIP_DEFLATED anzugeben bringt auch nix das hab ich in allen Varianten probiert.
Danke für jede Antwort!
Hier der Code:

Code: Alles auswählen

import zipfile
import os

def create_Safe():
    i = 1
    while True:
        Bool = True
        if os.path.isfile("Safes/Safe" + str(i) + ".zip"):
            i += 1
            Bool = False
        elif Bool == True:
            break
    password = input("Wählen sie ein Passwort für Safe[" + str(i) + "]\n>>")
    with open("README.txt", "w", encoding="utf8") as file:
        file.write("Password: " + password + "\n")
        file.close()
    with open("Safes/Safe" + str(i) + ".zip", "w") as zip_file:
        zip_file.write("README.txt")
        zip_file.close()
    os.remove("README.txt")
    main()

def open_Safe():
    pass

def main():
    os.system("cls")
    inp = input("="*10 + "Safe" + "="*10 + "\n[1]Create a Safe\n[2]Open a Safe\n" + "="*27 + "\n>>")
    if inp == "1":
        create_Safe()
    elif inp == "2":
        open_Safe()
    else:
        main()

if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Nur weil einer Datei die Endung .zip hat, ist das noch lange keine Zipdatei.
Rekursion ist kein Ersatz für eine Schleife. main darf nicht mehrmals aufgerufen werden, sondern in main brauchst du eine Schleife.
Die Schleife in create_Safe ist reichlich kompliziert. Du hast eine while-True-Schleife und eine zusätzliche Abbruchvariable kompliziert miteinander kombiniert. Statt dessen brauchst du eigentlich eine for-Schleife mit itertools.count.
close ist bei einem with-Block unnötig. Den Dateinamen solltest du nur einmal zusammenbauen und dann auch nur Formatstring statt +.
FynnDE
User
Beiträge: 6
Registriert: Dienstag 2. Juni 2020, 14:03

Danke
FynnDE
User
Beiträge: 6
Registriert: Dienstag 2. Juni 2020, 14:03

Es klappt wenn ich ZipFile als zipfile.ZipFile definiere und es dann so mache

Code: Alles auswählen

with ZipFile("Safes/Safe" + str(i) + ".zip", "w") as zip_file:
        zip_file.write("README.txt")
        zip_file.close()
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Und die anderen ganzen Anmerkungen von mir hast Du einfach ignoriert.

Code: Alles auswählen

import zipfile
from pathlib import Path
from itertools import count

SAFES_PATH = Path("Safes")

def create_safe():
    for i in count(1):
        filename = SAFES_PATH / f"Safe{i}.zip"
        if not filename.is_file():
            break
    print(f"Wählen sie ein Passwort für Safe[{i}]")
    password = input(">>")
    with zipfile.ZipFile(filename, "w") as zip_file:
        zip_file.writestr("README.txt", f"Password: {password}\n")

def open_safe():
    pass

def main():
    with True:
        print("==========Safe==========")
        print("[1]Create a Safe")
        print("[2]Open a Safe")
        print("===========================")
        choice = input(">>")
        if choice == "1":
            create_safe()
        elif choice == "2":
            open_safe()

if __name__ == "__main__":
    main()
Komisch ist noch, dass Du Dateien in einem Verzeichnis relativ zum aktuellen Arbeitsverzeichnis anlegest, und dann niemandem verrätst wie die Datei wirklich heißt.
Antworten