Wie Textdatei ohne Sonderzeichen schreiben

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
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

Habe nun eine Weile probiert, aber verstehe wohl grundlegende Dinge nicht.

Ich habe eine Textdatei als Input.
Da habe ich einige Wörter eingefügt, wie z.B.
KATZE
HUND
BIENE

Diese Wörter sollen sortiert werden (später auch upcase und mehrfache eliminieren)
Und wieder in eine neue Textdatei geschrieben werden

Problem 1:
Die Liste produziert unerwünschte Sonderzeichen wie [, ], ', \n

Problem 2:
während der Ausgabe versuche ich die Sonderzeichen zu unterdrücken.
Obwohl ich "\n" zweimal mit "" ersetze, generiert das Programm
BIENE\n\n

Problem 3:
Tatsächlich wird wird zusätzlich noch ein "\" vorangesetzt >> BIENE\\n\n
Das "\" kann ich nicht unterdrücken; ich erhalte dann eine EoL Warnung

Wie kann ich
BIENE
HUND
KATZE
zeilenmässig ausgeben ohne in Windows sichtbare Sonderzeichen?

Frage 4:
falls die Textdatei die Grüße eines Wörterbuchs mit vllt. 100 kB erreichen sollte, klappt dann das Sortieren der Liste im Speicher noch?

Ich häng mal mein Programm hier an:

datalist = []
inputfile = open("E:\woerter3.txt", "r")
for line in inputfile:
datalist.append([line])
inputfile.close()


# sortieren
datalist.sort()

# listenstring = ",".join(datalist)

# Speichern
outputfile = open("E:\woerter4.txt", "w")

for line in datalist:
linestr = str(line)

if "'" in linestr:
linestr = linestr.replace("'", "")
if "[" in linestr:
linestr = linestr.replace("[", "")
if "]" in linestr:
linestr = linestr.replace("]", "")
if "\n" in linestr:
linestr = linestr.replace("\n", "")
if "\n" in linestr:
linestr = linestr.replace("\n", "")

print(linestr)
# outputfile.write(linestr)
outputfile.close()
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 3 und mal 4.
Dateien öffnet man mit dem with-Statement, damit sie auch garantiert wieder geschlossen werden. Jede Zeile hat ein Zeile-Ende-Zeichen, das man normalerweise beim Einlesen wegstrippen möchte. \ als Pfadtrenner muß escaped werden. Text-Dateien sollten immer mit einem expliziten Encoding geöffnet werden.

Code: Alles auswählen

with open("E:\\woerter3.txt", encoding="ASCII") as lines:
    woerter = [line.strip() for line in lines]
Warum steckst Du jede Zeile in eine Liste? Das macht bei Dir doch nur alles komplizierter.

Die String-Repräsentation einer Liste ist nicht für die Weiterverarbeitung gedacht. Wenn Du an erster Stelle gar keine unnötigen Listen erzeugst, bleibt für den Rest:

Code: Alles auswählen

woerter.sort()
with open("E:\\woerter4.txt", "w", encoding="ASCII") as output:
    for wort in woerter:
        print(wort)
        output.write(f"{wort}\n")
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

vielen Dank für die schnelle Antwort, Sirius.
Einige Syntax muss ich noch verarbeiten, da will ich jetzt nicht fragen

Hier ein Auszug meiner Quelldatei:
wohin
zu\n
ÄSTE\n
ändern

Ich habe bei der Ausgabe versucht, die gelegentlichen \n zu entfernen
for wort in woerter:
if "\n" in wort:
wort = wort.replace("\n", "")

Leider klappt das nicht.

Da im Source Umlaute vorkommen, geht ASCII nicht; ich habe "cp1252" probiert, aber die Umlautworte stehen weiterhin am Ende
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

bei meinem Kommentar wurden leider die Idents entfernt.
... steht sicherlich in den Regeln, die ich nicht gelesen habe :-(
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Dafür ist ja .strip() da. Da musst du nichts mehr mit replace machen.

Angenommen du hast folgende Liste:

Code: Alles auswählen

BIENE
HUND
KATZE
BIENE
HUND
KATZE
BIENE
HUND
KATZE
BIENE
HUND
KATZE
und die liest du mit dem Code von Sirius3 ein (Kodierung musst du wissen, evtl. UTF-8?), dann kommt folgende Liste raus:

Code: Alles auswählen

['BIENE', 'HUND', 'KATZE', 'BIENE', 'HUND', 'KATZE', 'BIENE', 'HUND', 'KATZE', 'BIENE', 'HUND', 'KATZE']
Dort sind dann alle Zeilenumbrüche schon raus. Beim Zurückschreiben in die Datei musst du die natürlich wieder anhängen. Dafür hat Sirius3 aber auch schon Code geliefert.


Zur Einrückung:

Du musst im vollständigen Editor auf das </> Symbol klicken und den Code zwischen die Code-Tags packen.
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

@Jankie

strip() geht leider nicht.

"\n" bedeutet "newline"
ich suche aber nach "\" + "newline"
da geht replace("\\nl", "") sehr gut
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Was geht genau nicht? Was hast Du versucht, wie sieht der Code aus, und wie ist die komplette Fehlermeldung?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@KlausP: Ja "\n" bedeutet ”newline” aber ``replace("\\n", "")`` bedeutet nicht das ”newlines” ersetzt werden, sondern das die Zeichen \ gefolgt von n ersetzt werden, und das ist kein ”newline” sondern eben genau diese beiden Zeichen, ein \ gefolgt von einem n. Das bekommt man durch `strip()` ohne Argumente natürlich nicht weg, aber das sollte da auch überhaupt gar nicht in der Zeichenkette stehen wenn man vorher nicht schon einen Fehler gemacht hat. Und *den* Fehler solltest Du besser beheben als hinterher mit üblen Hacks an den Symptomen herumzudoktorn.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

@ Sirius3
habe irgendwie meine Antwort ins Nirwana gesendet; aber blackjack hat ja nun inzwischen geantwortet und erklärt

@ blackjack
ich hatte meine Sourcedatei verwurschtelt; immerhin an die 500 Wörter:
das wollte ich nicht manuell bereinigen; das Programm macht das viel schneller ;-)
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@KlausP: dann mußt Du Dein Problem korrekt beschreiben, also wie sieht die Eingabedatei aus, und wie ist der gewünschte Output.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@KlausP: ”Manuell” heisst ja mit einem Editor. Für einmaliges reparieren reicht das oft und geht bei vielem auch schneller als wenn man ein Programm dafür schreiben würde. Suchen und ersetzen kann man ja auch im Editor.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

@Sirius3: Hier ein Auszug meiner Quelldatei:
wohin
zu\n
ÄSTE\n
ändern

gewünschter Output ist:
wohin
zu
ÄSTE
ändern

Aber das Problem ist ja inzwischen gelöst. S. meine Antwort von 15:46 an Jankie
... da geht replace ("\\nl", "") sehr gut

@ alle: habe aber noch ein schwieriges logische Problem zu knacken; ich versuch aber erstmal selber
und vielen Dank für eure super Hilfe, heute
Antworten