[Python] Loswerden von \ n bei Verwendung von .readlines ()


Answers

Dies sollte tun, was Sie wollen (Dateiinhalt in einer Liste, nach Zeile, ohne \ n)

with open(filename) as f:
    mylist = f.read().splitlines() 
Question

Diese Frage hat hier bereits eine Antwort:

Ich habe eine TXT-Datei mit Werten darin.

Die Werte sind wie folgt aufgelistet:

Value1
Value2
Value3
Value4

Mein Ziel ist es, die Werte in eine Liste zu stellen. Wenn ich das tue, sieht die Liste so aus:

['Value1\n', 'Value2\n', ...]

Das \n wird nicht benötigt.

Hier ist mein Code:

t = open('filename.txt', 'r+w')
contents = t.readline()

alist = []

for i in contents:
    alist.append(i)



Ich benutzte die Streifenfunktion, um Newline-Charakter loszuwerden, während geteilte Linien Speicherfehler auf 4 gb-Datei verursachten.

Beispielcode:

with open('C:\\aapl.csv','r') as apple:
    for apps in apple.readlines():
        print(apps.strip())



Ich würde das tun:

alist = [line.rstrip() for line in open('filename.txt')]

oder:

with open('filename.txt') as f:
    alist = [line.rstrip() for line in f]



Nach dem Öffnen der Datei kann das Listenverständnis dies in einer Zeile tun:

fh=open('filename')
newlist = [line.rstrip() for line in fh.readlines()]
fh.close()

Denken Sie daran, Ihre Datei anschließend zu schließen.




with open('D:\\file.txt', 'r') as f1:
    lines = f1.readlines()
lines = [s[:-1] for s in lines]



Ich hatte das gleiche Problem und fand die folgende Lösung sehr effizient. Ich hoffe, dass es dir oder allen anderen hilft, die das Gleiche tun wollen.

Zuallererst würde ich mit einer "with" -Anweisung beginnen, da sie das ordnungsgemäße Öffnen / Schließen der Datei sicherstellt.

Es sollte ungefähr so ​​aussehen:

with open("filename.txt", "r+") as f:
    contents = [x.strip() for x in f.readlines()]

Wenn Sie diese Zeichenfolgen (jedes Element in der Inhaltsliste ist eine Zeichenfolge) in Ganzzahl oder Gleitkomma konvertieren möchten, können Sie Folgendes tun:

contents = [float(contents[i]) for i in range(len(contents))]

Verwenden Sie int anstelle von float wenn Sie in Ganzzahl konvertieren möchten.

Es ist meine erste Antwort in SO, tut mir leid, wenn es nicht in der richtigen Formatierung ist.




Sie können .rstrip('\n') um nur Zeilenumbrüche am Ende der Zeichenfolge zu entfernen:

for i in contents:
    alist.append(i.rstrip('\n'))

Dadurch bleiben alle anderen Leerzeichen intakt. Wenn dir am Anfang und am Ende deiner Linien kein Leerzeichen am .strip() liegt, heißt der große schwere Hammer .strip() .

Da Sie jedoch aus einer Datei lesen und sowieso alles in den Speicher ziehen, sollten Sie besser die Methode str.splitlines() verwenden . Dies teilt eine Zeichenfolge in Zeilentrennzeichen auf und gibt eine Liste von Zeilen ohne diese Trennzeichen zurück. Verwenden Sie dies für das Ergebnis von file.read() und verwenden Sie file.readlines() überhaupt nicht:

alist = t.read().splitlines()



Der einfachste Weg, dies zu tun, ist, file.readline()[0:-1] zu schreiben. Dies liest alles außer dem letzten Zeichen, das der Zeilenumbruch ist.




Ich habe dies kürzlich verwendet, um alle Zeilen aus einer Datei zu lesen:

alist = open('maze.txt').read().split()

oder Sie können dies für ein bisschen zusätzliche Sicherheit verwenden:

with f as open('maze.txt'):
    alist = f.read().split()

Es funktioniert nicht mit Leerzeichen zwischen Text in einer einzelnen Zeile, aber es sieht so aus, als hätte Ihre Beispieldatei möglicherweise keine Leerzeichen, die die Werte aufteilen. Es ist eine einfache Lösung und gibt eine genaue Liste von Werten zurück und fügt keine leere Zeichenfolge hinzu: '' für jede leere Zeile, z. B. einen Zeilenumbruch am Ende der Datei.




from string import rstrip

with open('bvc.txt') as f:
    alist = map(rstrip, f)

rstrip() Bene: rstrip() entfernt die Leerzeichen, also: \f , \n , \r , \t , \v , \x und leer ,
aber ich denke, Sie sind nur daran interessiert, die signifikanten Zeichen in den Zeilen zu behalten. Dann passt eine map(strip, f) besser und entfernt auch die Whitespaces.

Wenn Sie nur die Symbole NL \n und RF \r löschen möchten, tun Sie Folgendes:

with open('bvc.txt') as f:
    alist = f.read().splitlines()

splitlines () ohne übergebenes Argument behält die NL- und RF-Symbole nicht bei (Windows zeichnet die Dateien mit NLRF am Ende der Zeilen auf, zumindest auf meinem Rechner), behält aber die anderen Leerzeichen, insbesondere die Leerzeichen und Tabulatoren.

.

with open('bvc.txt') as f:
    alist = f.read().splitlines(True)

hat den gleichen Effekt wie

with open('bvc.txt') as f:
    alist = f.readlines()

das heißt NL und RF bleiben erhalten




Verwenden .strip() für jede Zeichenfolge in Ihrer Liste .strip() , die Leerzeichen vom Anfang oder Ende der Zeichenfolge entfernt:

for i in contents:
    alist.append(i.strip())

Aber je nach Anwendungsfall ist es besser, wenn Sie etwas wie numpy.loadtxt oder numpy.genfromtxt wenn Sie ein numpy.genfromtxt Array der Daten benötigen, die Sie aus der Datei lesen.