carriage return 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.
nons

naben allerseits...

...habe das problem, dass ich nach einlesen einer textdatei in eine liste die carriage return's nicht aus den strings entfernen kann.
habe es versucht mit

Code: Alles auswählen

s = string.replace(s, '\n','')
s = string.replace(s, '\r','')
,aber damit kann ich sie nicht entfernen.

kann mir jemand helfen ?
bin langsam etwas genervt...

danke und ciao
nons
joe

Hi!
nons hat geschrieben:

Code: Alles auswählen

s = string.replace(s, '\n','')
s = string.replace(s, '\r','')
Wo hast du denn das her? Das ist wirklich steinzeit-python.
s = s.replace('\n','').replace('\r','') sollte gehen, deine variante aber eigentlich auch auch. Zeig mal mehr code.
Wenn das "\n" nur am ende des strings ist, geht auch rstrip() oder rstrip("\r\n"), je nachdem welche bedeutung whitespace in deinen daten haben.
joe
Gast

...hmm. ok.
das ganze script ist zu lang ums zu posten - auch nicht wichtig denke ich
jetzt habe ich es so:

Code: Alles auswählen

f = file('lc.in', 'w')
for i in range(len(linkList)):
    if linkList[i][:4]!='HTTP' and linkList[i][:3]!='FTP':
        linkList[i]=url+linkList[i].rstrip("\r\n")
    f.write(linkList[i]+"\n")
    f.close()
tut leider immernoch nicht das was es soll.
tips??
joe

Hi!
Anonymous hat geschrieben: tut leider immernoch nicht das was es soll.
tips??
Mit
linkList = ["bar1\r\n\r\n","bar2\n","bar3\r"]
url = "foo"

vorab funktioniert das bei mir einwandfrei. Die datei sieht dann so aus:
blubbla1
blubbla2
blubbla3

joe
Gast

tja wenn ichs in meiner python-console teste klappt hier auf windows2k auch allerdings nich aufm linux-server aus der datei.

noch jemand eine idee?? oder nen hack?
.
.
.
Gast

Anonymous hat geschrieben:tja wenn ichs in meiner python-console teste klappt hier auf windows2k auch allerdings nich aufm linux-server aus der datei.
Also, wenn das davorsetzen der url klappt, muss auch das rstrip klappen. Da gibt es nichts. Das irgendwann die if-bedingung auch tatsächlich mal erfüllt ist, wirst du ja bereits getestet haben. Kannst du mal einen auszug aus der datei posten und, wenn möglich aus das, was als resultat dann in der ausgabedatei steht? Da muss dann ja hinter jeder zeile ohne HTTP und FTP am anfang eine zusätzliche leerzeile sein.
joe
Gast

posten des inhalts grade schlecht, allerdings kann ich sagen, dass auch eine s.replace('a','XXXX') gut funzt. nur eben nicht mit \r\n oder \r oder \n !
im editor unter linux steht dann in der datei etwa sowas:

Code: Alles auswählen

blubbblubb
blubbblubb
blubbblubb^M

blubbblubb
blubbblubb^M

blubbblubb
blubbblubb
blubbblubb
blubbblubb
das ^M scheint ein \r zu sein mit einem \n (die extra leerzeile) dahinter.
naja irgendwie ist das python2.3 hier merkwürdig...
joe

Anonymous hat geschrieben: das ^M scheint ein \r zu sein mit einem \n (die extra leerzeile) dahinter.
Richtig. Für Linux/Unix ist \r ein zeichen, mit dem es nicht anfangen kann. Sollte man unter Linux also auch in textdaten vermeiden. Ich hätte allerdings angenommen, daß rstrip("\r\n") sehr wohl auch unter LInux für \r funktioniert. Werd ich gleich mal testen.
Falls möglich, würd ich vorher mit dos2unix die datei von den \r bzw ^M befreien. Dann dürfte das script auf jeden fall kein problem haben.
joe
joe

joe hat geschrieben:Werd ich gleich mal testen.
Tja, funktioniert bei mir tadellos (python 2.4.2). Wenns bei dir immernoch nicht klappt, bin ich mit meinem latein am ende. An der älteren python-version kann es eigentlich nicht liegen.
joe
joe

Anonymous hat geschrieben:

Code: Alles auswählen

blubbblubb
blubbblubb
blubbblubb^M

blubbblubb
blubbblubb^M

blubbblubb
blubbblubb
blubbblubb
blubbblubb
Moment! Wieso sind da zeilen ohne leerzeilen dazwischen? Wenn linkList nur zeilen mit einem zeilenumbruch am ende enthält (egal in welcher form) und rstrip() nach deiner angabe nie funktionert, dann müsste doch durch das "\n" in f.write(linkList+"\n") jede 2. zeile eine leerzeile sein. Ich glaub eher, du hast da die programmlogik nicht im griff.
joe
BlackJack

Anonymous hat geschrieben:

Code: Alles auswählen

f = file('lc.in', 'w')
for i in range(len(linkList)):
    if linkList[i][:4]!='HTTP' and linkList[i][:3]!='FTP':
        linkList[i]=url+linkList[i].rstrip("\r\n")
    f.write(linkList[i]+"\n")
    f.close()
Benötigts Du die `linkList` denn nach der Schleife noch? Diese "Indexerei" ist nämlich ziemlich "unpythonic". Ich würde beim Einlesen der Datei ansetzen und die im "Universal-Newline" Modus öffnen. Dann ist schon mal egal ob sie mit Mac, Win oder Unix Zeilenenden gespeichert wurde. Funktioniert folgendes?

Code: Alles auswählen

links = open('test.txt', 'rU')
out_file = open('lc.in', 'w')
for link in links:
    if not (link.startswith('HTTP') or link.startswith('FTP')):
        link = url + link
    out_file.write(link)
links.close()
out_file.close()
joe

Hi!
BlackJack hat geschrieben:

Code: Alles auswählen

    if not (link.startswith('HTTP') or link.startswith('FTP')):
 
Kleine korrektur: da fehlt noch ein not hinterm or.
joe
joe

joe hat geschrieben:Kleine korrektur: da fehlt noch ein not hinterm or.
joe
Schwachsinn! Bitte vergessen.
joe
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

@nons: hast du jetzt eigentlich eine Lösung oder nicht?!?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
raist1314
User
Beiträge: 52
Registriert: Dienstag 21. September 2004, 06:58
Wohnort: Adelzhausen
Kontaktdaten:

Warum keine regulären Ausdrücke?

Code: Alles auswählen

import re

# windows zeilenende wegschmeissen
link = re.sub("\r\n$","",link)
Gruss

Sebastian
joe

Hi!
raist1314 hat geschrieben:Warum keine regulären Ausdrücke?
Warum reguläre ausdrücke? Für schlichte textersetzung ist das overkill.
Zumdem löscht dein regexp nur "\r\n", rstrip("\r\n") dagegen auch "\n" (oder auch "\r"), wenn es alleine am zeilenende ist.
joe
raist1314
User
Beiträge: 52
Registriert: Dienstag 21. September 2004, 06:58
Wohnort: Adelzhausen
Kontaktdaten:

joe hat geschrieben: Warum reguläre ausdrücke? Für schlichte textersetzung ist das overkill.
Overkill??? aber es funktioniert wenigstens... Pfffff.... reguläre Ausdrücke Overkill...
joe hat geschrieben: Zumdem löscht dein regexp nur "\r\n", rstrip("\r\n") dagegen auch "\n" (oder auch "\r"), wenn es alleine am zeilenende ist.
Es sollte nicht schwierig sein, den Ausdruck so hinzukriegen...

Sebastian
joe

Hi!
raist1314 hat geschrieben:Overkill??? aber es funktioniert wenigstens... Pfffff.... reguläre Ausdrücke Overkill...
Bitte konkret: Wo siehst du den vorteil von link = re.sub("[\r\n]*$","",link) gegenüber link = link.rstrip("\r\n")? rstrip() ist imho lesbarer und - wenn denn wichtig - auch schneller. Und wenn bei nons rstip() nicht funktioniert, dann deine lösung unter garantie auch nicht. Funktional ist da kein unterschied.
joe
raist1314
User
Beiträge: 52
Registriert: Dienstag 21. September 2004, 06:58
Wohnort: Adelzhausen
Kontaktdaten:

Ok,Ok ... in dem simplen Fall wirst Du wohl recht haben, ich persönlich würde für Textmanipulationen immer reguläre Ausdrücke verwenden, das hat sich irgendwie so bei mir eingeschliffen. Wie es mit dem Geschwindigkeitsvorteil von rstrip aussieht, kann ich nicht beurteilen, da ich mir die Implementierung jetzt nicht angesehen habe...

Gruss

Sebastian
Gast

hihi...

...schuldigung, dass ich mich so lange nicht gemeldet habe, aber konnte keine weiteren tests fahren, daher erst jetzt meine antwort.
es klappt immernoch nicht. weder mit regex noch irgendwie anders.
die liste hätte ich gerne danach noch, darum das blöde rumindexieren.
bin echt überfragt. habe langsam das gefühl, die python version aufm server
is sehr fehlerhaft. es gab da bei anderen skripten unter python2.4 schon sehr merkwürdige fehler.
da ich in verbindung mit zope arbeite bin ich z.z. leider noch auf 2.4 angewiesen, bis der admin die version umbiegt. werde jetzt versuchen aus 2.4 heraus das skript unter 2.3 zu fahren. habe so das gefühl das könnte klappen. sage dann bescheid.

danke für die vielen tips...
ciao
nons
Antworten