Newline character 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
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hallo,
Ich möchte unterschiedlich lange Dateien Zeilenweise auslesen und später in Datei schreiben.

Wie bekomme ich das letzte newline character am besten entfernt?

Code: Alles auswählen

dfkksdfjak
asdfjlkas
sdfjlkasdfj
sjdflkas

Code: Alles auswählen

if __name__ == '__main__':
    firstSeqRead = False
    setNewLine = False
    biggestSeqLength = 5
    
    f = open("a.txt",'r')

    trimmed = 0
    deleted = 0
    while(True):
        line = f.readline().rstrip()
        if not line:
            break
        elif firstSeqRead == False:
            seqLen = len(line)

 
        if seqLen < biggestSeqLength:
            deleted += 1
            continue
    
        if (seqLen >= biggestSeqLength):
            if setNewLine == True:
                temp = "\n"
            else:
                temp = ""
            print temp + line,
            trimmed += 1   
	
        setNewLine = True
Viele Grüße
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code und Frage passen irgendwie nicht zusammen. Willst du wirklich nur den Zeilenumbruch nach der letzten Zeile entfernen oder möchtest du einen Zeilenumbruch ab einer bestimmten Zeilenlänge, so wie man es in einem Editor hätte?
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Der Code ist der erste versuch müsste nur print durch f_out ersetzen. Ich würde den Zeilenumbruch nach der letzten Zeile entfernen momentan. Und ich weiss nicht wie man es am einfachsten macht.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wende `.rstrip()` auf den gesamten Text an. Das entfernt "Whitspace", also Newlines, Tabs, Leerzeichen am Ende. Du hast es doch eigentlich auch schon für jede Zeile so gemacht. Mach es halt einmal für den gesamten Text und dann kannst du es so in die Datei schreiben.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Die eingabe Datei kann ziemlich gross sein und deshalb wollte ich zeilenweise in eine Datei schreiben. Ich hätte gedacht, dass es etwas einfacherer geht als ich es versucht habe.
problembär

snafu hat geschrieben:Wende `.rstrip()` auf den gesamten Text an. Das entfernt "Whitspace", also Newlines, Tabs, Leerzeichen am Ende.
`.rstrip("\n")` wirkt sogar nur auf (Unix-)Newlines am Ende.
Allerdings schneidet .rstrip() auch mehrmals vorkommende Zeichen ab. Ich hab' mir deshalb noch sowas gebaut (was bestimmt noch jemand besser / kürzer schreiben könnte):

Code: Alles auswählen

def chomp(a, b = "\n"):

    if len(a) < len(b): 
        return a

    if a.endswith(b):
        return a[0: len(a)-len(b)]

    return a
Gruß
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

problembär hat geschrieben:Ich hab' mir deshalb noch sowas gebaut (was bestimmt noch jemand besser / kürzer schreiben könnte)
Nicht viel besser, aber ein kleines bisschen kürzer und PEP8-konform:

Code: Alles auswählen

def chomp(a, b="\n"):
    if len(a) < len(b): 
        return a
    if a.endswith(b):
        return a[:len(a)-len(b)]
    return a
BlackJack

Die erste ``if``-Abfrage würde ich auch weglassen. Falls das eine Optimierung sein soll: Dringend überprüfen ob, und wenn überhaupt, was die an Zeit bringt. Mich würde nämlich nicht wundern, wenn dieser Test auch in dem C-Code von `startswith()` als erstes gemacht wird.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

def chomp(a, b='\n'):
    return a[:-len(b)] if a.endswith(b) else a
Ein "Standard-Timeit" bringt bei mir (etwas betagtes Modell) circa 1,3 Sekunden im Vergleich zu 1,9 Sekunden bei derdons Version bei einem "hello\n". Und mit einem "hello" 1,4 (derdon) knapp 1 Sek (ich).
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Falls sich jemand für die Implementierung von '.startswith()` und `.endswith()` interessiert:

http://pastebin.com/f6cf48e09

Leider geht http://paste.pocoo.org/ im Moment nicht. Da finde ich das Highlighting lesbarer.
Antworten