Jedes Wort aus .txt-Datei in eine eigene Zeile 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
Rotkehlchen
User
Beiträge: 20
Registriert: Freitag 7. Dezember 2018, 07:39

Hallo liebes Forum,
denke der Betreff sagt schon fast alles: ich habe ein Textdokument, aus dem jede Zeichenkette ausgelesen und in eine eigene Zeile geschrieben werden soll. Habe es u. a. so probiert, falls jemand was zum Lachen braucht:

Code: Alles auswählen

with open("privat\Quelle.txt") as lines:
	lines.replace(' ', '\n')

# ...hätte ich mir schon fast gedacht:
Traceback (most recent call last):
  File "<pyshell#20>", line 2, in <module>
    lines.replace(' ', '\n')
AttributeError: '_io.TextIOWrapper' object has no attribute 'replace'
Danke für jeden Tipp!
Rotkehlchen
User
Beiträge: 20
Registriert: Freitag 7. Dezember 2018, 07:39

So das war mal wieder Trick 17: wenn du nicht weißt, was du machen sollst, frag jemanden und dir wird die Antwort selbst einfallen ;)
Das ist der funktionierende Code, den ich mir inzwischen überlegt habe:

Code: Alles auswählen

quelle = open (Quelldatei,'r')
    ziel = open (Zieldatei, 'w')
    
    zeilen = quelle.readlines()
    zeile = 0
    while zeile < len(zeilen):
        aktuelleZeile = zeilen[zeile]
        wörterinaktuellerZeile = aktuelleZeile.split(' ')
        for wort in wörterinaktuellerZeile:
            ziel.write(wort + '\n')
        zeile += 1
    quelle.close()
    ziel.close()
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Auch wenn es geht, ist es doch etwas holperig.

Statt muehselig mit Indizes in die Liste zu arbeiten, macht man das ganz einfach mit

Code: Alles auswählen

with open(quelldatei, "r") as quelle, open(zieldatei, "w") as ziel:
    for line in quelle:
          ziel.writelines("\n".join(line.strip().split()))
Du solltest immer with benutzen um dir das explizite schliessen der Datei zu sparen, und gleichzeitig sicher zu sein, dass es geht. Und du brauchst keinen Index bei Dingen, ueber die man iterieren kann. Erst recht nicht mit while, wo du selbst den Zaehler baust. Das waere *wenn* besser mit

Code: Alles auswählen

for index in range(laenge)
erledigt - aber auch das ist ein Anti-Pattern wenn man danach noch nur auf eine Datenstruktur zugreift, die man gleich iterieren koennte.
Rotkehlchen
User
Beiträge: 20
Registriert: Freitag 7. Dezember 2018, 07:39

Hallo __deets__,
erst mal vielen Dank für Deine Hilfe!
Da ich mich aber weder mit dem writelines()- noch mit dem join()- oder strip()-Befehl auskenne, weiß ich nicht, wie ich bei Deiner Version verhindern kann, dass ich die ursprünglichen Zeilenumbrüche lösche. Denn wenn ich Deinen Code ausführe, werden zwar einwandfrei aus den Leerzeichen Zeilenumbrüche gemacht, bestehende Zeilenumbrüche verschwinden jedoch völlig und so werden jeweils die letzten und ersten Wörter eines Absatzes ohne Trennung zusammengeschrieben.
Ich werde mal versuchen, eine Lösung hierfür zu finden.
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Rotkehlchen hat geschrieben: Dienstag 11. Dezember 2018, 14:20Da ich mich aber weder mit dem writelines()- noch mit dem join()- oder strip()-Befehl auskenne, weiß ich nicht, wie ich bei Deiner Version verhindern kann, dass ich die ursprünglichen Zeilenumbrüche lösche.
Zum Glück sind die Befehle dokumentiert :-)

https://docs.python.org/3/library/stdty ... #str.split
https://docs.python.org/3/library/io.ht ... writelines
https://docs.python.org/3/library/stdty ... #str.strip
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Rotkehlchen hat geschrieben: Dienstag 11. Dezember 2018, 14:20 Hallo __deets__,
erst mal vielen Dank für Deine Hilfe!
Da ich mich aber weder mit dem writelines()- noch mit dem join()- oder strip()-Befehl auskenne, weiß ich nicht, wie ich bei Deiner Version verhindern kann, dass ich die ursprünglichen Zeilenumbrüche lösche. Denn wenn ich Deinen Code ausführe, werden zwar einwandfrei aus den Leerzeichen Zeilenumbrüche gemacht, bestehende Zeilenumbrüche verschwinden jedoch völlig und so werden jeweils die letzten und ersten Wörter eines Absatzes ohne Trennung zusammengeschrieben.
Ich werde mal versuchen, eine Lösung hierfür zu finden.
Das ist natuerlich nicht so gewollt von mir - aber einfach das strip weglassen, und das letzte Wort einer Zeile hat halt sein \n noch dabei. Alternativ einfach ein "" an die Liste aus dem split anghaengen, dann erledigt das join das automatisch mit.
Rotkehlchen
User
Beiträge: 20
Registriert: Freitag 7. Dezember 2018, 07:39

Okay, danke ArtooDetoo!
Ich habe mir überlegt, dass das Problem daher rühren könnte, dass split() bei Leerzeichen und Umbrüchen trennt, und wollte das mit einer Regular Expression beheben... leider liefert mir der überarbeitete Code genau dasselbe Ergebnis:

Code: Alles auswählen

import re
with open(quelldatei, "r") as quelle, open(zieldatei, "w") as ziel:
    for line in quelle:
          ziel.writelines("\n".join(re.split('\n| ', line.strip())))
Rotkehlchen
User
Beiträge: 20
Registriert: Freitag 7. Dezember 2018, 07:39

@ __deets__ sorry hab Deine Antwort übersehen. Wenn ich das strip weglasse, ändert sich gar nichts am Ergebnis.
Und das mit dem "" anhängen meinst Du vermutlich nicht so oder?

Code: Alles auswählen

with open(quelldatei, "r") as quelle, open(zieldatei, "w") as ziel:
    for line in quelle:
          ziel.writelines("\n".join(line.strip().split().append("")))

__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, sonder split liefert dir doch eine Liste. Und aus einer Liste + einer anderen Liste macht man eine neue Liste. Und mit einem Leeren String in einer zweiten Liste, die du mit der Liste aus dem split verbindest, erzeugst du deine extra Leerzeile.
Antworten