windows zeilenende entfernen

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
fellfresse
User
Beiträge: 6
Registriert: Donnerstag 2. November 2006, 22:34
Wohnort: Wismar
Kontaktdaten:

hallo,
ich versuche derzeit ein script zu schreiben in dem die windows zeilenenden aus einer datei entfernt werden.
doch leider macht er das nicht.
wenn ich prüfe ob das windows z-ende (\r\n) in der datei is kommt ein true. also erkennt das skript ja schon mal was ich will.
aber wenn ich dann versuche diesen ausdruck zu ersetzen durch das unix zeilenende (\n) dann sieht die datei danach im hexeditor genauso aus (0D 0A)

hier mal mein script:

Code: Alles auswählen

dateiname = 'windowstextdatei.txt'

try:
  datei = open(dateiname, 'r+')
except IOError:
  print 'Die Datei %s wurde nicht gefunden, oder kann nicht geoeffnet werden.' % filename

for line in datei:
	if('\r\n' in line):
		line.rstrip('\r\n','\n') #ersetzen durch ein Unix-Zeilenende
		datei.write(line)
	else:
		break		
		
datei.close()

print(">>> Konvertierung erfolgreich abgeschlossen...")
liegt das an der syntax oder warum wird die datei quasi nur kopiert?
der thread http://www.python-forum.de/topic-4365.h ... zeilenende hat mir da auch nich wirklich weiter geholfen...

danke für die hilfe im voraus
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Haeh? In Zeile 11 solltest du eigentlich eine Exception bekommen, da rstrip nur ein Argument nimmt. So funktionierts:

Code: Alles auswählen

>>> "hallo\r\nwelt".replace("\r\n", "\n")
'hallo\nwelt'
fellfresse
User
Beiträge: 6
Registriert: Donnerstag 2. November 2006, 22:34
Wohnort: Wismar
Kontaktdaten:

tschuldigung,
hab ein codebeispiel aus dem verlinkten thread ausprobiert und das nich wieder korrigiert.

die zeile heisst natürlich so:

Code: Alles auswählen

line.replace('\r\n','\n') #ersetzen durch ein Unix-Zeilenende
aber trotzdem macht es "nur" das wie oben beschrieben.

hier mal 2 scrennshots zum verdeutlichen:
die datei:
Bild
und die hex-ansicht:
Bild
hier hab ich mal die hex-werte für das win-zeilenende angezeigt.

diesen ausdruck bekomme ich vor und nachdem bearbeiten durch das script, es passiert also nix.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Es muss auch:

Code: Alles auswählen

line = line.replace('\r\n','\n')
heissen da Strings unveränderbar sind.

Gruss
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Da du anscheinend unter Linux arbeitest: Kennst du schon dos2unix und unix2dos?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Na, wenn wir schon am rummäkeln sind ;-): Was ist denn "filename"?

SCNR,
Christian (mache auch solche Fehler)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

fellfresse hat geschrieben:ein script zu schreiben in dem die windows zeilenenden aus einer datei entfernt werden.
Hi fellfresse!

- dos2unix.py: http://www.python-forum.de/topic-7759.html
- unix2dos.py: http://www.python-forum.de/topic-7760.html

Vielleicht kannst du damit etwas anfangen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

und hier noch ein Beitrag aus dem Forum.
fellfresse
User
Beiträge: 6
Registriert: Donnerstag 2. November 2006, 22:34
Wohnort: Wismar
Kontaktdaten:

danke an alle für die hilfe.
ich habe mich an die lösung von gerold gehalten.

schade das meine variante nicht klappt, obwohl ich den grund noch nicht verstehe. die zeichen werden ja entfernt.soweit hab ich es getestet.
der fehler muss in den zeilen liegen in dem das zwischenergebniss in die datei zurückgeschrieben wird.
es is bestimmt nich möglich direkt eine zeile zu überschreiben und dann die nächste zeile einlesen, bearbeiten und überschreiben?!?!?!
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Im Text-Modus werden die Zeilenumbrüche automatisch in die Standardform (bei Windows '\r\n') umgewandelt. Wenn Du das verhindern willst, mußt Du die Datei im Binary-Mode öffnen, z.B. file('test.txt', 'wb')
MfG
HWK
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

fellfresse hat geschrieben:obwohl ich den grund noch nicht verstehe.
Hallo fellfresse!

Das Problem ist, dass du nicht nur einen Fehler gemacht hast.

Ich habe dein Programm mal kommentiert. Bitte nicht falsch vestehen. Ich will dich damit nicht runter machen. Ich möchte, dass du daraus etwas lernst und ein guter Python-Programmierer wirst.

Code: Alles auswählen

dateiname = 'windowstextdatei.txt'

# Teilweise falsche Einrückung (zwei statt vier Leerzeichen)
try:
  datei = open(dateiname, 'r+')
  # Die Datei wird hier also im TEXTMODUS zum Lesen und Schreiben geöffnet.
  # Jedes Zeilenende ist hiermit automatisch "\n" und nicht "\r\n", wie später
  # von dir erwartet.
  
except IOError:
  print 'Die Datei %s wurde nicht gefunden, oder kann nicht geoeffnet werden.' % filename
# Du fängst zwar den Fehler ab, reagierst aber nicht darauf. Das Programm
# läuft weiter. Auch wenn die Datei nicht existiert. Folglich wird spätestens
# in der nächsten Programmzeile ein Fehler ausgelöst.


for line in datei:
    if('\r\n' in line):
    # Die ``if``-Bedingungen müssen nicht geklammert werden.
    # Das macht erst dann Sinn, wenn es mehrere Bedingungen gibt -- um diese
    # optisch voneinander zu trennen.
    
        line.rstrip('\r\n','\n')
        # Das geht schon gar nicht. Erstens nimmt ``rstrip()`` nur einen Parameter
        # und zweitens sollte hier schon eher ``replace()`` stehen, damit es auch
        # eine Auswirkung haben könnte. Dann solltest du das Ergebnis auch einer
        # Variablen zuweisen. (z.B.: ``line = line.replace("\r\n", "\n")``)
        
        datei.write(line)
        # Hier würdest du den Text von der aktuellen Position aus mit dem neuen
        # Text überschreiben. Erstens ist die aktuelle Position exakt nach dem
        # soeben gelesenen -- also stehst du hier falsch und zweitens würdest du
        # den Text mit der falschen Zeichenanzahl überschreiben. Du kannst ein
        # "\r\n" nicht mit "\n" überschreiben, da "\n" zu wenig Platz beansprucht.
        # Würdest du den Text sogar an der korrekten Position überschreiben, dann 
        # wäre das Ergebnis am Zeilenende "\n\n".
        
    else:
        break       
       
datei.close()

print(">>> Konvertierung erfolgreich abgeschlossen...") 
Die meisten Probleme kannst du vermeiden, in dem du aus einer Datei liest, die Änderungen im Speicher durchführst und in eine andere Datei schreibst. Wenn alles erfolgreich durchgeführt wurde, dann kannst du z.B. die alte Datei löschen und die neue Datei umbenennen.
Wenn es sich um kleine Dateien handelt, dann kannst du die Datei zum Lesen öffen, den Inhalt der Datei komplett in den Speicher laden, dann die Datei schließen, zum Schreiben öffnen und dann den geänderten Text in die Datei schreiben.
Die Datei zum Lesen und gleichzeitig zum Schreiben zu öffnen, ist dann schon eher etwas fortgeschrittenes und führt in vielen Fällen auch nicht zum Erfolg.

Und hier habe ich noch Lesestoff für dich: http://www.python-forum.de/topic-6157.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Ergänzung zu Gerold's Ausführungen wo sich der Dateizeiger befindet: Der Iterator über die Zeilen einer Datei puffert grössere Blöcke aus Effizienzgründen, d.h. das `write()` könnte irgendwo mitten in eine der Folgezeilen schreiben!

Oder es könnte auch gar nichts passieren, weil abwechselndes lesen und schreiben auf einer entsprechend geöffneten Datei undefinierte Resultate liefert, wenn zwischen dem Wechseln der beiden Zugriffsarten nicht `seek()` aufgerufen wird! Ich weiss nicht ob das irgendwo in der Python-Doku steht, aber das ist POSIX-Standardverhalten der darunterliegenden Systembibliothek.
fellfresse
User
Beiträge: 6
Registriert: Donnerstag 2. November 2006, 22:34
Wohnort: Wismar
Kontaktdaten:

ich bin überrascht von der qualität und der mühe die in diesem forum herrscht. wünscht man sich in anderen auch.

also ich bin der letzte der sich durch konstruktive kritik beleidigt fühlt.
danke für die hinweise.
@gerold:
einige der fehler die du kommentiert hattest, habe ich schon allein entfernt.
ich hatte an dem skript was ausprobiert aber nicht alles wieder entfernt, aber gepostet.

das mit der dateiarbeit is nen denkfehler von mir. habe noch nich so viel mit dateien gemacht. aber nach euren erklärungen bin ich erleuteter :)

danke für eure mühen!
Antworten