Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| From | Hermann Riemann <nospam.ng@hermann-riemann.de> |
|---|---|
| Newsgroups | ger.ct |
| Subject | Re: Python-Skripte |
| Date | 2025-07-15 18:54 +0200 |
| Message-ID | <mdnfdvFbl2iU1@mid.individual.net> (permalink) |
| References | <Dateien-20250715163205@ram.dialup.fu-berlin.de> |
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>
Back to ger.ct | Previous | Next | Find similar | Unroll thread
Re: Python-Skripte Hermann Riemann <nospam.ng@hermann-riemann.de> - 2025-07-15 18:54 +0200
csiph-web