Seite 1 von 1

Ersetzen von nicht druckbaren Zeichen

Verfasst: Samstag 12. November 2022, 16:32
von qdox
Hallo,

ich habe aus dem Internet eine Tabelle kopiert, als Textdatei abgespeichert, per Script eingelesen und zeilenweise mit Formatstring für die Konsole schön gemacht.

Jede Zeile hat 3 Spalten, die durch Tabulatoren getrennt sind. Die Ausgabe erfolgt so:

Code: Alles auswählen

for zeile in tabelle.split("\n"):
    print( "{:15} | {:60} | {:>10}".format( *zeile.split("\t") ) )
Und dann der Schreck. Die "|" waren verschoben. Ich habe den Übeltäter ausfindig gemacht. Im Text hatte sich ein "\u200e" versteckt. Das Unicode Steuerzeichen "Left-to-Right Mark". Das wird wohl bei der Berechnung der Textlänge berücksichtigt, da es aber nicht ausgegeben wird, passt die Formatierung dann nicht.

Keiner meiner benutzen Texteditoren (Geany, Pluna, Bluefish) zeigt das an. Nur wenn man in Einzelschritten durch den Text geht, kann man das merken. Aber wer macht das schon?

In diesem Fall ist die Lösung einfach. Entweder die paar Zeilen manuell korigieren oder im Script mit Replace entfernen.

Mich würde aber interessieren, ob es eine Möglichkeit gibt, alle nicht druckbaren Steuerzeichen automatisch zu entfernen.

Viele Grüße

Re: Ersetzen von nicht druckbaren Zeichen

Verfasst: Samstag 12. November 2022, 17:02
von __blackjack__
@qdox: Man könnte sich da vielleicht einen Filter auf Basis von Unicode-Kategorien basteln. Siehe `unicodedata.category()` und das Internet für Infos was die bedeuten und welche Zeichen da jeweils drunter fallen.

Re: Ersetzen von nicht druckbaren Zeichen

Verfasst: Sonntag 13. November 2022, 18:22
von qdox
Hallo Blackjack,

danke. Das hat mir geholfen. Ich filtere jetzt im Text die Zeichen der Unicode-Kategorie "Cf" = "Other, Format" raus. Das ganze konnte ich in eine Zeile pressen.

Code: Alles auswählen

tabelle = "".join( list( filter( lambda zeichen: unicodedata.category(zeichen) != "Cf" , tabelle ) ) )
Bisher funktioniert das, wobei ich noch nicht jedes einzelne Zeichen der Kategorie angeschaut habe, ob alle wirklich raus sollen. Die Liste habe ich unter https://www.compart.com/de/unicode/category/Cf gefunden.

Viele Grüße

Re: Ersetzen von nicht druckbaren Zeichen

Verfasst: Sonntag 13. November 2022, 20:36
von __blackjack__
@qdox: Der `list()`-Aufruf ist überflüssig, `join()` nimmt jedes iterierbare Objekt, auch den Iterator, den `filter()` liefert.

Re: Ersetzen von nicht druckbaren Zeichen

Verfasst: Dienstag 15. November 2022, 16:52
von qdox
Hallo Blackjack,

nochmal danke. Das kommt davon, wenn man sich der Lösung langsam annähert.

Ich habe zuerst die Filterfunktion geschrieben. Da kam aber nur "<filter object at 0x7fdb982cccd0>" raus. Also habe ich daraus eine Liste erzeugt um das Ergebnis anzeigen zu lassen. Danach mit "join()" zusammengefügt und übersehen, dass "list()" jetzt nicht mehr gebraucht wird.

Viele Grüße