Seite 1 von 1

Problem mit einem Zip Archiv

Verfasst: Mittwoch 19. August 2020, 21:06
von FynnDE
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()

Re: Problem mit einem Zip Archiv

Verfasst: Mittwoch 19. August 2020, 21:46
von Sirius3
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 +.

Re: Problem mit einem Zip Archiv

Verfasst: Mittwoch 19. August 2020, 22:10
von FynnDE
Danke

Re: Problem mit einem Zip Archiv

Verfasst: Mittwoch 19. August 2020, 22:16
von FynnDE
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()

Re: Problem mit einem Zip Archiv

Verfasst: Donnerstag 20. August 2020, 09:01
von Sirius3
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.