Thread View: ger.ct
3 messages
3 total messages
Started by ram@zedat.fu-ber
Tue, 15 Jul 2025 15:34
Python-Skripte
Author: ram@zedat.fu-ber
Date: Tue, 15 Jul 2025 15:34
Date: Tue, 15 Jul 2025 15:34
118 lines
3764 bytes
3764 bytes
Hermann Riemann <nospam.ng@hermann-riemann.de> schrieb oder zitierte: :Bei kurzen und einfachen Programmen stimmt Absicht und Wirkung überein. :Beispiel: :Folgendes Programm löscht lange Zeilen :im tmp/html_Dateien Verzeichnis: :#!/usr/bin/python3 :import os, sys, string, time, datetime :for dirname,dirnames,filenames in os.walk("/tmp/html_Dateien"): : for filename in filenames: : fullname=f"{dirname}/{filename}" : l=open(fullname).readlines() : f=open(fullname,"w") : for zeile in l: : z=zeile.strip() : if len(z)>80:continue : f.write(z) : f.write('\n') : f.close() Diese Program schreibt die mit ".strip()" behandelten Zeilen, es löscht also möglicherweise auch einigen Leerraum. Dann öffnet es eine Datei zum Schreiben, die noch zum Lesen geöffnet ist. Der Inhalt wurde zwar mit ".readlines()" gelesen, aber es sollte sicherer sein, die Lesedatei erst einmal zu schließen. Das Lesen mit ".readlines()" könnte Probleme bei sehr großen Dateien verursachen. Es könnte auch noch sicherer sein, dafür gleich "with" zu verwenden und vorher mit "os.path.isfile" zu prüfen, ob der Eintrag wirklich eine Datei ist. >>Und bei neuronalen Netzen ist es noch schlimmer. >Änderungen beim Weitererzählen soll ja auch bei Menschen vorkommen. Ich, Schreibe ein Python-Programm, das bei allen Textdateien im Verzeichnis "/tmp/html_Dateien" alle Zeilen löscht, die mehr als 80 Zeichen lang sind! , der Chatbot: |Hier ist ein Python-Programm, das alle Zeilen aus allen |Textdateien im Verzeichnis "/tmp/html_Dateien" löscht, die |mehr als 80 Zeichen lang sind. | |#!/usr/bin/env python3.13 |""" |Entfernt alle Zeilen, die länger als 80 Zeichen sind, aus |allen Textdateien im Verzeichnis /tmp/html_Dateien. | |Das Programm liest jede Datei zeilenweise ein, filtert die |ungewollten Zeilen heraus und überschreibt die Quelldateien |mit den gefilterten Inhalten. | |Autor: [Dein Name] |""" | |import os |import shutil |from pathlib import Path | |# Konfiguration |VERZEICHNIS = Path("/tmp/html_Dateien") |MAX_ZEICHEN = 80 | |def filtere_zeilen(dateipfad: Path) -> None: | """ | Entfernt alle Zeilen, die länger als MAX_ZEICHEN Zeichen sind, aus der angegebenen Datei. | | Die Datei wird atomar überschrieben. | """ | tmp_datei = dateipfad.with_suffix(dateipfad.suffix + '.tmp') | with dateipfad.open("r", encoding="utf-8") as infile, \ | tmp_datei.open("w", encoding="utf-8") as outfile: | for zeile in infile: | # Zeilenumbruch nicht mitzählen, falls Zeile mit \n endet | if len(zeile.rstrip("\r\n")) <= MAX_ZEICHEN: | outfile.write(zeile) | # Atomar ersetzen | tmp_datei.replace(dateipfad) | |def ist_textdatei(pfad: Path) -> bool: | """ | Bestimmt, ob die Datei eine reguläre Textdatei ist (heuristisch: Endungen .txt, .html, .htm). | """ | return ( | pfad.is_file() | and pfad.suffix.lower() in {'.txt', '.html', '.htm'} | and not pfad.name.endswith('.tmp') | ) | |def main(): | """ | Durchsucht /tmp/html_Dateien und behandelt alle geeigneten Textdateien. | """ | for eintrag in VERZEICHNIS.iterdir(): | if ist_textdatei(eintrag): | try: | filtere_zeilen(eintrag) | print(f"Gefiltert: {eintrag.name}") | except Exception as e: | print(f"Fehler bei {eintrag.name}: {e}") | |if __name__ == "__main__": | main() | | |Hinweise: |- Nur Dateien mit den Endungen ".txt", ".html" oder ".htm" | werden verändert (heuristisch; bei Bedarf anpassen). |- Die Kodierung ist explizit auf UTF-8 gesetzt, was für | moderne Textdateien empfehlenswert ist. .
Re: Python-Skripte
Author: ram@zedat.fu-ber
Date: Tue, 15 Jul 2025 17:09
Date: Tue, 15 Jul 2025 17:09
35 lines
1324 bytes
1324 bytes
Hermann Riemann <nospam.ng@hermann-riemann.de> schrieb oder zitierte: >Am 15.07.25 um 17:34 schrieb Stefan Ram: >>Dann öffnet es eine Datei zum Schreiben, die noch zum Lesen geöffnet >>ist. Der Inhalt wurde zwar mit ".readlines()" gelesen, aber es >>sollte sicherer sein, die Lesedatei erst einmal zu schließen. >Was soll passieren? >Die Datei bleibt vielleicht noch offen bis f.close() >der alte Datei das Attribut unbenutzt zuschiebt. Also, ich kann im Moment nicht sagen, was passieren könnte. Es sollte gehen, aber scheint mir trotzdem als vorsichtiger, die Datei vor dem nächsten Öffnen zu schließen. >>Das Lesen mit ".readlines()" könnte Probleme bei sehr großen >>Dateien verursachen. >Im Hauptspeicher+swap? Wenn ich Dateien in den Hauptspeicher lese, die einige GByte groß sind, könnte das meine Sitzung durch zu viel Auslagerungsarbeit beeinträchtigen. >In filenames von os.walk keine Dateien? Es könnten symbolische Verbindungen zu Dateien sein, aber falls diese wie Dateien behandelt werden sollen, wäre keine weitere Sonderbehandlung nötig. >> | if len(zeile.rstrip("\r\n")) <= MAX_ZEICHEN: . . . >Schwieriger zu lesen und dann noch "\r\n": >also für Linux nicht brauchbar. In diesem Fall bedeutet das nur: "\r" /oder/ "\n", nicht "\r" gefolgt von "\n".
Re: Python-Skripte
Author: Hermann Riemann
Date: Tue, 15 Jul 2025 18:54
Date: Tue, 15 Jul 2025 18:54
136 lines
4632 bytes
4632 bytes
Am 15.07.25 um 17:34 schrieb Stefan Ram: > Hermann Riemann <nospam.ng@hermann-riemann.de> schrieb oder zitierte: > :Bei kurzen und einfachen Programmen stimmt Absicht und Wirkung überein. > :Beispiel: > :Folgendes Programm löscht lange Zeilen > :im tmp/html_Dateien Verzeichnis: > :#!/usr/bin/python3 > :import os, sys, string, time, datetime > :for dirname,dirnames,filenames in os.walk("/tmp/html_Dateien"): > : for filename in filenames: > : fullname=f"{dirname}/{filename}" > : l=open(fullname).readlines() > : f=open(fullname,"w") > : for zeile in l: > : z=zeile.strip() > : if len(z)>80:continue > : f.write(z) > : f.write('\n') > : f.close() > > Diese Program schreibt die mit ".strip()" behandelten Zeilen, > es löscht also möglicherweise auch einigen Leerraum. Bei html Dateien, die weiter analysiert wurden, war das erwünscht. Viele Seiten aus dem internet rücken sehr weit ein. Bei Python und C Programme würde ich rstrip() vorziehen, > Dann öffnet es eine Datei zum Schreiben, die noch zum Lesen geöffnet > ist. Der Inhalt wurde zwar mit ".readlines()" gelesen, aber es > sollte sicherer sein, die Lesedatei erst einmal zu schließen. Was soll passieren? Die Datei bleibt vielleicht noch offen bis f.close() der alte Datei das Attribut unbenutzt zuschiebt. > Das Lesen mit ".readlines()" könnte Probleme bei sehr großen > Dateien verursachen. Im Hauptspeicher+swap? > Es könnte auch noch sicherer sein, dafür gleich "with" zu verwenden > und vorher mit "os.path.isfile" zu prüfen, ob der Eintrag wirklich > eine Datei ist. In filenames von os.walk keine Dateien? Wenn es keine html_Dateien wären müsste ich noch mit os.system(f"file {fullname}>/tmp.zeige.txt") Typ etc prüfen. >>> Und bei neuronalen Netzen ist es noch schlimmer. >> Änderungen beim Weitererzählen soll ja auch bei Menschen vorkommen. > > Ich, > > Schreibe ein Python-Programm, das bei allen Textdateien im > Verzeichnis "/tmp/html_Dateien" alle Zeilen löscht, die mehr > als 80 Zeichen lang sind! > > , der Chatbot: > > |Hier ist ein Python-Programm, das alle Zeilen aus allen > |Textdateien im Verzeichnis "/tmp/html_Dateien" löscht, die > |mehr als 80 Zeichen lang sind. > | > |#!/usr/bin/env python3.13 > |""" > |Entfernt alle Zeilen, die länger als 80 Zeichen sind, aus > |allen Textdateien im Verzeichnis /tmp/html_Dateien. > | > |Das Programm liest jede Datei zeilenweise ein, filtert die > |ungewollten Zeilen heraus und überschreibt die Quelldateien > |mit den gefilterten Inhalten. > | > |Autor: [Dein Name] > |""" > | > |import os > |import shutil > |from pathlib import Path > | > |# Konfiguration > |VERZEICHNIS = Path("/tmp/html_Dateien") > |MAX_ZEICHEN = 80 > | > |def filtere_zeilen(dateipfad: Path) -> None: > | """ > | Entfernt alle Zeilen, die länger als MAX_ZEICHEN Zeichen sind, aus der angegebenen Datei. > | > | Die Datei wird atomar überschrieben. > | """ > | tmp_datei = dateipfad.with_suffix(dateipfad.suffix + '.tmp') > | with dateipfad.open("r", encoding="utf-8") as infile, \ > | tmp_datei.open("w", encoding="utf-8") as outfile: > | for zeile in infile: > | # Zeilenumbruch nicht mitzählen, falls Zeile mit \n endet > | if len(zeile.rstrip("\r\n")) <= MAX_ZEICHEN: > | outfile.write(zeile) > | # Atomar ersetzen > | tmp_datei.replace(dateipfad) > | > |def ist_textdatei(pfad: Path) -> bool: > | """ > | Bestimmt, ob die Datei eine reguläre Textdatei ist (heuristisch: Endungen .txt, .html, .htm). > | """ > | return ( > | pfad.is_file() > | and pfad.suffix.lower() in {'.txt', '.html', '.htm'} > | and not pfad.name.endswith('.tmp') > | ) > | > |def main(): > | """ > | Durchsucht /tmp/html_Dateien und behandelt alle geeigneten Textdateien. > | """ > | for eintrag in VERZEICHNIS.iterdir(): > | if ist_textdatei(eintrag): > | try: > | filtere_zeilen(eintrag) > | print(f"Gefiltert: {eintrag.name}") > | except Exception as e: > | print(f"Fehler bei {eintrag.name}: {e}") > | > |if __name__ == "__main__": > | main() > | > | > |Hinweise: > |- Nur Dateien mit den Endungen ".txt", ".html" oder ".htm" > | werden verändert (heuristisch; bei Bedarf anpassen). > |- Die Kodierung ist explizit auf UTF-8 gesetzt, was für > | moderne Textdateien empfehlenswert ist. Schwieriger zu lesen und dann noch "\r\n": also für Linux nicht brauchbar. -- <http://www.hermann-riemann.de>
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads