Ersetzen von nicht druckbaren Zeichen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
qdox
User
Beiträge: 12
Registriert: Sonntag 6. März 2016, 12:14

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
Benutzeravatar
__blackjack__
User
Beiträge: 13940
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Benutzeravatar
qdox
User
Beiträge: 12
Registriert: Sonntag 6. März 2016, 12:14

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
Benutzeravatar
__blackjack__
User
Beiträge: 13940
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@qdox: Der `list()`-Aufruf ist überflüssig, `join()` nimmt jedes iterierbare Objekt, auch den Iterator, den `filter()` liefert.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Benutzeravatar
qdox
User
Beiträge: 12
Registriert: Sonntag 6. März 2016, 12:14

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
Antworten