@tz_wuerzburg: die Namensgebung ist verwirrend für mich. `zipfile_erstellen` ist ein Name für eine Funktion. Dass dreimal `xml/daten/` vorkommt, ist schlecht, weil man Dopplungen vermeiden sollte. Solche Konstanten sollten auch als Konstanten am Anfang des Programms geschrieben werden.
Die Funktionsnamen dagegen sind eigentlich Variablennamen, weil sie keine Tätigkeit beschreiben (`zip` ist egal wie, zu kurz). zip_xml_name hieße besser `ermittle_xml_dateiname`.
import_original ist auch ein schlechter Name, weil ja nichts importiert wird. `quell_textdateiname` wäre klarer, dann weiß ich wenigstens, dass es sich um die Text-Datei handelt, die aber im aktuellen Verzeichnis liegen muß, was bei einer Funktion keine gute Voraussetzung ist, wenn man sie flexibel einsetzen will.
Bei Zip-Dateien ist es besonders wichtig, dass sie ordentlich geschlossen werden, weil noch ein Verzeichnis ans Ende der Datei geschrieben wird, daher immer mit with öffnen.
Dass dann das Ergebnis so ähnlich heißt wie die übergebene Textdatei in einem relativ dazu liegenden Pfad gespeichert wird und auch noch eine xml-Datei mit ähnlichem Namen existiert, macht die Funktion quasi unmöglich zu verändern und korrekt zu verwenden. Diese ganze Information mag zwar im Kontext Deines Problems korrekt sein, aber das als Bedingung für eine Funktion implizit zu fordern, ist nicht gut, weil zu versteckt.
In `zip_xml_name` steht ein `return` in einer for-Schleife, das immer beim ersten Schleifendurchlauf die Schleife beendet, und das noch ziemlich kompliziert formuliert.
Beim jetzt nochmal durchlesen, sehe ich, dass quell_textdateiname gar nicht der Name der Text-Datei ist, die in die ZIP-Datei geschrieben wird, sondern die eigentliche Datei hat noch ein ready_ davor.
Wenn ich alles richtige entschlüsselt habe, komme ich bei sowas raus:
Code: Alles auswählen
RELATIVE_XML_DATEN_PATH = Path("xml/daten/")
ZIP_FILENAMES_FILENAME = RELATIVE_XML_DATEN_PATH / "zipfile_name.txt"
READY_TEXT_FILENAME_PATTERN = "ready_{0.name}"
READY_ZIP_FILENAME_PATTERN = "ready_{0.stem}.zip"
def get_first_filename(filenames_filename):
""" reads the first filename of a file named filenames_filename
and returns this filename relative to the directory where filenames_filename
lies"""
with open(filenames_filename, encoding="utf-8") as lines:
filenames = csv.reader(lines, delimiter="\t")
return filenames_filename.parent / next(filenames)[0]
def write_zip_file(source_filename):
""" writes a zip file with
needs special directory structure at the place where source_filename lives"""
basepath = source_filename.parent
text_filename = basepath / READY_TEXT_FILENAME_PATTERN.format(source_filename)
zip_filename = basepath / RELATIVE_XML_DATEN_PATH / READY_ZIP_FILENAME_PATTERN.format(source_filename)
xml_filename = get_first_filename(basepath / ZIP_FILENAMES_FILENAME)
with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as archive:
archive.write(text_filename, text_filename.name)
archive.write(xml_filename, xml_filename.name)