Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > ger.ct > #642415

Re: Python-Skripte

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>

Show all headers | View raw


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


Thread

Re: Python-Skripte Hermann Riemann <nospam.ng@hermann-riemann.de> - 2025-07-15 18:54 +0200

csiph-web