Wie füge ich eine neue Zeile in einer Textdatei mit python ohne \ n hinzu

Ich habe eine Datei, die eine Liste von Dateien hat, aber es fügt \n am Ende, wie kann ich Python nur schreiben Sie die Info, die ich auf eine neue Zeile, ohne \n in die Art und Weise, so dass meine Info wird X.acc nicht x.acc\n ? Hier ist mein Code, der die Datei schreibt

 def add(x): nl = "\n" acc = ".acc" xy = x + acc exyz = xy xyz = exyz xxx = str(xyz) tf = open('accounts.dat',"a+") tf.writelines(nl) tf.writelines(xxx) tf.close 

Hier ist der Code, der die Datei aufruft:

 import sys tf = open('accounts.dat','r') names = tf.readlines() u = choicebox(msg="pick something",title = "Choose an account",choices=(names)) counter_file = open(u, 'r+') content_lines = [] for line in counter_file: if line == "credits =": creds = line else: False for line in counter_file: if 'credits =' in line: line_components = line.split('=') int_value = int(line_components[1]) + 1 line_components[1] = str(int_value) updated_line= "=".join(line_components) content_lines.append(updated_line) else: msgbox(msg=(creds)) content_lines.append(line) counter_file.seek(0) counter_file.truncate() counter_file.writelines(content_lines) counter_file.close() 

Danke für deine Hilfe und sorry, wenn dies eine Trival Frage noch neu ist, um Python 🙂

3 Solutions collect form web for “Wie füge ich eine neue Zeile in einer Textdatei mit python ohne \ n hinzu”

Ihre Frage ist eigentlich nicht sinnvoll, denn was für eine "Linie" eigentlich ist und was das bedeutet '\n' bedeutet.

Dateien haben kein intrinsisches Konzept von Linien. Eine Datei ist nur eine Folge von Bytes. '\n' ist der Zeilentrennzeichen (wie Python es mit universellen Zeilenumbrüchen darstellt). Wenn Sie möchten, dass Ihre Daten auf verschiedenen "Zeilen" erscheinen, müssen Sie einen Zeilen-Trenner zwischen ihnen setzen. Das ist alles, was der '\n' Charakter ist. Wenn Sie die Datei in einem Texteditor öffnen, nachdem Sie es geschrieben haben, werden die meisten Editoren nicht explizit das Newline-Zeichen standardmäßig anzeigen, da es bereits durch die Trennung der Zeilen dargestellt wird.


Um zu brechen, was Ihr Code tut , schauen wir uns die add Methode an und reparieren einige Dinge auf dem Weg.

Das erste, was add , ist der Name eine Variable namens nl und ordne ihm das Zeilenumbruchzeichen zu. Daraus kann ich vermuten, dass nl für "newline" steht, aber es wäre viel besser, wenn das eigentlich der Variablenname wäre.

Als nächstes benennen wir eine Variable namens acc und weisen ihm das '.acc' , vermutlich als Dateierweiterung oder so etwas zu verwenden.

Als nächstes machen wir eine Variable namens xy und weisen sie an x + acc . xy ist jetzt ein String, obwohl ich keine Ahnung habe, was er aus dem Variablennamen enthält. Mit etwas Wissen darüber, was x soll oder was diese Zeilen darstellen, vielleicht könnte ich xy um etwas sinnvoller umbenennen.

Die nächsten drei Zeilen erzeugen drei neue Variablen namens exyz , xyz und xxx und zeigen sie alle auf denselben String, den xy verweist. Es gibt keinen Grund für irgendwelche dieser Zeilen, da ihre Werte nicht wirklich sinnvoll genutzt werden.

Jetzt öffnen wir eine Datei. Fein. Vielleicht steht tf für "die Datei"? "Textdatei"? Wiederum würde das Umbenennen den Code viel freundlicher machen.

Nun nennen wir tf.writelines(nl) . Dies schreibt das Zeilenumbruchzeichen ( '\n' ) in die Datei. Da die writelines Methode für das Schreiben einer ganzen Liste von Strings, nicht nur ein einzelnes Zeichen gedacht ist, wird es sauberer sein, wenn wir diesen Aufruf zu tf.write(nl) ändern. Ich würde das auch ändern, um das Zeilenumbruch am Ende zu schreiben, anstatt den Anfang, also das erste Mal, wenn du in die Datei schreibst, fügt es keine leere Zeile an die Front ein.

Als nächstes nennen writelines wieder writelines , mit unserer writelines ( xxx , aber hoffentlich wurde dies umbenannt!). Was das eigentlich tut, zerbricht das iterable xxx (einen String) in seine Komponentenzeichen und schreibt dann jede der Dateien in die Datei. Besser ersetzen Sie dies auch mit tf.write(xxx) .

Schließlich haben wir tf.close , was ein Verweis auf die close Funktion des tf.close ist. Es ist ein No-op, denn was du vermutlich gemeint hast, war, die Datei zu schließen, indem du die Methode tf.close() : tf.close() . Wir konnten auch die Akte als Kontextmanager einpacken , um ihre Verwendung ein wenig sauberer zu machen. Auch die meisten Variablen sind nicht notwendig: Wir können String-Formatierung verwenden, um die meisten Arbeiten in einem Schritt zu tun. Alles in allem könnte deine Methode am Ende des Tages so aussehen:

 def add(x): with open('accounts.dat',"a+") as output_file: output_file.write('{0}.acc\n'.format(x)) 

So können Sie sehen, der Grund, warum das '\n' am Ende jeder Zeile erscheint, ist, weil Sie es zwischen jeder Zeile schreiben. Darüber hinaus ist dies genau das, was Sie tun müssen, wenn Sie möchten, dass die Zeilen als "Zeilen" in einem Texteditor erscheinen. Ohne den Zeilensprung Charakter, würde alles erscheinen alle zerschlagen zusammen (nehmen Sie die '\n' in meiner add Methode oben und sehen Sie selbst!).


Das Problem, das Sie in dem Kommentar beschrieben haben, geschieht, weil names ein direktes Lesen der Datei ist. Wenn man die readlines Dokumentation betrachtet , gibt sie eine Liste der Zeilen in der Datei zurück und brechen bei jedem Zeilenumbruch. str.strip diese Namen zu säubern, willst du Zeile 4 des Code, den du gepostet hast, um str.strip auf den einzelnen Zeilen str.strip . Das kannst du so machen:

 names = tf.readlines() for i in range(len(names)): names[i] = names[i].strip() # remove all the outside whitespace, including \n 

Allerdings ist es viel sauberer, schneller und in der Regel schöner, die Vorteile von Pythons Listenverständnis zu nutzen , und die Tatsache, dass Dateiprofile bereits zeilenweise sind. Also der Ausdruck unten ist gleichbedeutend mit dem vorherigen, aber es sieht viel schöner aus:

 names = [line.strip() for line in tf] 

Ändern Sie einfach add:

 def add(x): nl = "\n" acc = ".acc" xy = x + acc exyz = xy xyz = exyz xxx = str(xyz) tf = open('accounts.dat',"a+") tf.writelines(xxx) tf.writelines(nl) # Write the newline AFTER instead of before the output tf.close() # close is a function so needs to be called by having () at the end. 

Siehe die Kommentare für was sich geändert hat.

Warum schreibst du nicht einfach eine Funktion mit "\ n" am Ende der Zeile. Also keine Notwendigkeit erinnern "\ n" jedes Mal

Ich habe auf diese Weise –

 import os log_path = r"c:\python27\Logs\log.txt" if not os.path.exists(r"c:\python27\Logs"): os.mkdir(r"c:\python27\Logs") def write_me_log(text): global log_path with open(log_path,"a+") as log: log.write(text+"\n") write_me_log("Hello this is the first log text with new line") 
  • Ziemlich schreiben und drucken String-Elemente eines numpy ndarray (Python)
  • Python Newbie Fragen - Nicht korrekte Werte drucken
  • Fehlerbindungsparameter 0: wahrscheinlich nicht unterstützter Typ
  • Bejeweled Bit-Board mit Schwerkraft
  • Subprocess popen stdout
  • Anfügen von Variablen an Textdatei funktioniert nicht in Python
  • Logik in Bezug auf die Verwendung von Leerzeichen mit Unary Operators in Python3
  • Wie man Zeilen in zwei Dateien vergleichen kann, sind gleich oder verschieden in Python
  • Versuche, b '' aus meinem Numpy Array zu streifen
  • Verwenden der Warteschlange in Python
  • Unendliche Schleife beim Hinzufügen von zwei Integern mit bitweisen Operationen in Python 3
  • Python ist die beste Programmiersprache der Welt.