@theoS: Das `Path`-Objekte selbst auch Kontextmanager sind war micht nicht klar, weiss jetzt ohne nachzulesen auch gar nicht was das wohl bedeuten mag. Also mit anderen Worten ``with Path(…) as raus_text:`` bringt nichts. Es ging um *Datei*-Objekte und da bringt es das die geschlossen werden wenn der Programmfluss den ``with``-Block verlässt, und zwar egal aus welchem Grund das passiert.
Das hier wäre das was man nur braucht:
Code: Alles auswählen
Path(ausgabe_name).write_text(text_in_datei_aus_csv, "utf-8")
`raus_text` für eine Datei und `text_in_datei_aus_csv` für Text der nicht in einer Datei ist sind wirklich keine guten Namen. Und wo der Text mal her kam ist normalweise auch völlig egal.
Das ``Path("../.DruckData/")`` einen Ordner im Heimatverzeichnis des Benutzers anlegt ist ja eher Zufall, beziehungsweise funktioniert nur wenn das aktuelle Arbeitsverzeichnis eines im Heimatverzeichnis dieses Benutzer ist. Für das Heimatverzeichnis hat `Path` die Klassenmethode `home()`, die unabhängig vom aktuellen Arbeitsverzeichnis funktioniert.
Von einer Funktion die `checkfolder()` heisst würde man erwarten das die etwas prüft, nicht das die ein Verzeichnis anlegt. Der Test mit `exists()` ist unnötig, man kann das Verzeichnis doch einfach anlegen lassen mit ``exists_ok=True``.
"../.DruckData/" sollte man auch nicht mehr als einmal im Programm stehen haben. Wenn man das mal ändern möchte sollte man das nur an einer Stelle anpassen müssen und nicht an mehreren. Das macht Arbeit und ist fehleranfällig.
`a` ist ein schlechter Name. Wenn der `rows` heissen würde, nach dem was da tatsächlich enthalten ist, dann würde man auch sehen das `column` ein falscher Name ist, denn das ist ja weder eine Spalte noch eine Spaltennummer sondern eine Zeilen-/Datensatznummer.
`printDat()` ist als Name auch nicht gut. Da wird nichts mit `print()` ausgegeben sondern es werden Dateien gespeichert. Das wird aus dem Namen nicht klar.
Die ganzen ``+=``-Operation sind unübersichtlich und ineffizient. In den mehrzeiligen Zeichenkettenliteralen sind führende Leerzeichen die in den Dateien bestimmt nicht schön aussehen. Wenn man in einer Schleife, oder wie hier manuell eine Zeichenkette mit ``+=`` aufbaut, dann ist der idiomatische Weg in Python eine Liste mit den Teilen zu erstellen und die mit der `join()`-Methode auf Zeichenketten zusammen zu setzen.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
import csv
from pathlib import Path
ABFRAGE_FILENAME = Path(__file__).with_name("TB_Ausgabe_Abfrage8StueckII.txt")
def save_rows_as_files(rows):
for file_number, row in enumerate(rows):
text = "\n".join(
[
"^XA",
"^FO15,90^GB780,0,8,^FS",
"^FO15,250^GB780,0,8,^FS",
"^FO15,700^GB780,0,8,^FS",
"^FO0,0^GB600,200,2",
"^FO15,20^GB780,785,4^FS",
"^FO0,40^A0,50,50^FB800,1,0,C^FD",
#
# muss ich noch rauskriegen wie das in die csv kommt
#
"ABC Dingsbums",
"^FS",
"^FO0,110^A0,60,60^FB800,1,0,C^FD",
row[1],
"^FS",
"^FO0,190^A0,70,70^FB800,1,0,C^FD",
row[2],
"^FS",
"^FO0,80^BY3",
"^BCN,170,Y,N,N",
"^FO130,270^BY4^FD",
#
# das muss noch dynamisch werden
#
"12345667890",
"^FS",
"^FO0,500^A0,60,50^FB800,,0,C^FD",
row[3],
"^FS",
"^FO0,580^A0,60,50^FB800,,0,C^FD",
row[4],
"^FS",
"^FO0,730^A0,60,60^FB800,1,0,C^FD",
row[5],
"^FS",
"^XZ",
"",
]
)
path = Path.home() / ".DruckData"
path.mkdir(exist_ok=True)
path.with_name(f"testT{file_number}.zpl").write_text(text, "utf-8")
def main():
#
# TODO Falls ASCII nicht ausreicht, hier die tatsächliche Kodierung
# einsetzen.
#
with ABFRAGE_FILENAME.open(encoding="ascii") as lines:
rows = csv.reader(lines, delimiter=";")
next(rows) # Skip first row.
save_rows_as_files(rows)
if __name__ == "__main__":
main()