Wie lese ich eine Textdatei in eine Zeichenfolgenvariable und entferne Zeilenumbrüche?


963

Ich verwende das folgende Codesegment, um eine Datei in Python zu lesen:

with open ("data.txt", "r") as myfile:
    data=myfile.readlines()

Die Eingabedatei lautet:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN
GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

und wenn ich Daten drucke, bekomme ich

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Wie ich sehe, sind Daten in listForm. Wie mache ich es String? Und auch , wie entferne ich die "\n", "["und "]"Zeichen von ihm?



7
Der Titel und die Frage sind inkonsistent. Wollen Sie das \ n wirklich auch loswerden?
Julian

2
Möchten Sie wirklich Zeilenumbrüche aus dem Datei- / Zeichenfolgeninhalt entfernen, oder sind Sie nur verwirrt über die vielen Metazeichen in Ihrer Druckausgabe und möchten die Zeilenumbrüche tatsächlich beibehalten, aber nicht als "\ n" anzeigen lassen?
Mnagel

11
Für diejenigen, die von einer Suchmaschine hierher kommen, suchen Sie wahrscheinlich nach @ xiaoyus Antwort
Jonathan Sudiaman

Antworten:


1320

Du könntest benutzen:

with open('data.txt', 'r') as file:
    data = file.read().replace('\n', '')

66
Gibt es einen Nachteil, wenn man open("data.txt").read().replace('\n','')stattdessen nur schreibt ?
Tuomassalo

262
Ja, Ihre Version schließt die Datei nicht explizit. Dies wird verzögert, bis der Garbage Collector ausgeführt oder das Programm beendet wird. Die 'with'-Anweisung enthält normalerweise einige Setup / Teardown-Aktionen zum Öffnen / Schließen.
schlaflos

12
Danke für die Klarstellung. Es scheint also, dass meine Version für kleine Skripte in Ordnung ist - aber OTOH sollte vorzugsweise ganz vermieden werden, um es nicht zur Gewohnheit zu machen.
Tuomassalo

10
@tuomassalo Es ist eine riesige PITA im Test- / Debug-Prozess, da die geöffneten Dateihandles nicht bereinigt werden, wenn Sie vorzeitig beenden müssen oder eine Ausnahme auftritt.
GoingTharn

13
Nein, entfernt rstrip('\n')nur die neue Zeile aus der letzten Zeile, replace('\n','')entfernt sie überall (im Wesentlichen macht die gesamte Datei eine Zeile)
schlaflos

631

Verwenden Sie read()nicht readline():

with open('data.txt', 'r') as myfile:
  data = myfile.read()

6
Vielleicht, aber es streift keine Zeilenumbrüche, wie es das OP wollte. Ich mag es trotzdem.
Randall Cook

60
Wenn Sie eine einzelne Zeichenfolge zurückgeben, macht das Entfernen von Zeilenumbrüchen keinen Sinn. Das OP sollte eine Zeichenfolge auswählen oder \ n aus den Zeichenfolgen in der Liste entfernen.
Alex Dupuy

Funktioniert aber nicht Unicode-Dateien. Um utf8 auf Python3 zu unterstützen, verwenden Sie ein zusätzliches Argumentencoding="utf-8"
FindOutIslamNow

2
Ich verstehe nicht, warum diese Lösung veröffentlicht wurde und es gibt auch so viele positive Stimmen. Es ist im Grunde das gleiche wie das, das vor über einem Jahr akzeptiert wurde, und es fehlt sogar der neue Teil zum
Entfernen

65

Sie können aus einer Datei in einer Zeile lesen:

str = open('very_Important.txt', 'r').read()

Bitte beachten Sie, dass dadurch die Datei nicht explizit geschlossen wird.

CPython schließt die Datei, wenn sie als Teil der Garbage Collection beendet wird.

Andere Python-Implementierungen werden dies jedoch nicht tun. Um tragbaren Code zu schreiben, ist es besser, withdie Datei explizit zu verwenden oder zu schließen. Kurz ist nicht immer besser. Siehe https://stackoverflow.com/a/7396043/362951


32
Dies ist anti-idiomatisch und wird nicht empfohlen. opensollte innerhalb einer with ... asAnweisung verwendet werden.
Jorge Leitao

1
@JC kannst du das Problem erklären? Ist das nur eine Frage der Sitte oder bringt die with ... asAussage etwas?
Titou

4
@Titou das Problem ist, dass open.read () die Datei nicht schließt, so dass wir entweder brauchen with ... asoder str.close()wie in Pedros Antwort gezeigt. Mehr über die Wichtigkeit des Schließens von Dateien hier
JBallin

@JBallin. Diese Redewendung beseitigt eindeutig eine Fehlerquelle. Vielen Dank !
Titou

3
Das ist auch schlecht, weil Sie gerade str()von Builtins beschattet wurden
Chris_Rands


45

In Python 3.5 oder höher können Sie mit pathlib den Inhalt von Textdateien in eine Variable kopieren und die Datei in einer Zeile schließen:

from pathlib import Path
txt = Path('data.txt').read_text()

und dann können Sie str.replace verwenden , um die Zeilenumbrüche zu entfernen:

txt = txt.replace('\n', '')

31
with open("data.txt") as myfile:
    data="".join(line.rstrip() for line in myfile)

join () verbindet eine Liste von Zeichenfolgen, und rstrip () ohne Argumente schneidet Leerzeichen, einschließlich Zeilenumbrüche, vom Ende der Zeichenfolgen ab.


12

Dies kann mit der read () -Methode erfolgen:

text_as_string = open('Your_Text_File.txt', 'r').read()

Oder da der Standardmodus selbst 'r' (Lesen) ist, verwenden Sie einfach,

text_as_string = open('Your_Text_File.txt').read()

9

Ich habe eine Weile damit herumgespielt und bevorzuge die Verwendung readin Kombination mit rstrip. Ohne rstrip("\n")fügt Python am Ende der Zeichenfolge eine neue Zeile hinzu, was in den meisten Fällen nicht sehr nützlich ist.

with open("myfile.txt") as f:
    file_content = f.read().rstrip("\n")
    print file_content

6

Es ist schwer genau zu sagen, wonach Sie suchen, aber so etwas sollte Ihnen den Einstieg erleichtern:

with open ("data.txt", "r") as myfile:
    data = ' '.join([line.replace('\n', '') for line in myfile.readlines()])

reduzieren (Lambda x, y: x + y.rstrip ('\ n'), ['a \ n', "b \ n", 'c'], "") ist viel cooler: D
schlaflos und

3
@Duncan was würdest du vorschlagen?
Chris Eberle

data = ' '.join(line.replace('\n', '') for line in myfile)oder die Version von MagerValp.
Duncan

6

Ich bin überrascht, dass noch niemand erwähnt splitlines()hat.

with open ("data.txt", "r") as myfile:
    data = myfile.read().splitlines()

Variable dataist jetzt eine Liste, die beim Drucken folgendermaßen aussieht:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Beachten Sie, dass es keine Zeilenumbrüche gibt ( \n).

An diesem Punkt klingt es so, als ob Sie die Zeilen auf die Konsole zurückdrucken möchten, was Sie mit einer for-Schleife erreichen können:

for line in data:
    print line

4

Sie können auch jede Zeile entfernen und zu einer endgültigen Zeichenfolge verketten.

myfile = open("data.txt","r")
data = ""
lines = myfile.readlines()
for line in lines:
    data = data + line.strip();

Dies würde auch gut funktionieren.


Danke Pedro. Ich habe es nur zum besseren Verständnis hinzugefügt.
Sai Kiriti Badam

3

Sie können dies in eine in zwei Codezeilen komprimieren !!!

content = open('filepath','r').read().replace('\n',' ')
print(content)

Wenn Ihre Datei lautet:

hello how are you?
who are you?
blank blank

Python-Ausgabe

hello how are you? who are you? blank blank

3

Dies ist eine einzeilige, kopierbare Lösung, die auch das Dateiobjekt schließt:

_ = open('data.txt', 'r'); data = _.read(); _.close()

2
f = open('data.txt','r')
string = ""
while 1:
    line = f.readline()
    if not line:break
    string += line

f.close()


print string

2
Schleifen mit a string += linesollten vermieden werden. Einige Versionen von Python können hier möglicherweise das Verhalten von O (n ^ 2) vermeiden, aber alle anderen Antworten, die gegeben wurden, sind besser als diese. Außerdem haben Sie die angeforderten Zeilenumbrüche nicht entfernt, sodass Ihr Code nur sehr langsam ausgeführt werden kannstring = f.read()
Duncan,

Danke, dass du mich korrigiert hast. Aber eine kleine Sache ist, dass ich die neue Zeile nicht entfernen muss, weil sie beim Testen nicht '\ n' ausgedruckt hat. @ Duncan
Hungneox

2

python3: Google "list comphrension", wenn die Syntax in eckigen Klammern für Sie neu ist.

 with open('data.txt') as f:
     lines = [ line.strip( ) for line in list(f) ]


1

Ich habe nicht das Gefühl, dass jemand den [] Teil Ihrer Frage angesprochen hat. Wenn Sie jede Zeile in Ihre Variable einlesen, weil es mehrere Zeilen gab, bevor Sie das \ n durch '' ersetzt haben, haben Sie am Ende eine Liste erstellt. Wenn Sie eine Variable von x haben und diese einfach mit ausdrucken

x

oder drucke (x)

oder str (x)

Sie sehen die gesamte Liste mit den Klammern. Wenn Sie jedes Element von (Array von Sortierungen) aufrufen

x [0] dann werden die Klammern weggelassen. Wenn Sie die Funktion str () verwenden, sehen Sie nur die Daten und nicht das ''. str (x [0])


1

Vielleicht könnten Sie das versuchen? Ich benutze dies in meinen Programmen.

Data= open ('data.txt', 'r')
data = Data.readlines()
for i in range(len(data)):
    data[i] = data[i].strip()+ ' '
data = ''.join(data).strip()

1

Regulärer Ausdruck funktioniert auch:

import re
with open("depression.txt") as f:
     l = re.split(' ', re.sub('\n',' ', f.read()))[:-1]

print (l)

['Ich', 'fühle', 'leer', 'und', 'tot', 'innen']


1

Um Zeilenumbrüche mit Python zu entfernen, können Sie die replaceFunktion einer Zeichenfolge verwenden.

In diesem Beispiel werden alle drei Arten von Zeilenumbrüchen entfernt:

my_string = open('lala.json').read()
print(my_string)

my_string = my_string.replace("\r","").replace("\n","")
print(my_string)

Beispieldatei ist:

{
  "lala": "lulu",
  "foo": "bar"
}

Sie können es mit diesem Wiederholungsszenario versuchen:

https://repl.it/repls/AnnualJointHardware

Geben Sie hier die Bildbeschreibung ein


0

Dies funktioniert: Ändern Sie Ihre Datei in:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

Dann:

file = open("file.txt")
line = file.read()
words = line.split()

Dadurch wird eine Liste mit dem folgenden Namen erstellt words:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Das hat das "\ n" beseitigt. Gehen Sie folgendermaßen vor, um den Teil über die Klammern zu beantworten, die Ihnen im Weg stehen:

for word in words: # Assuming words is the list above
    print word # Prints each word in file on a different line

Oder:

print words[0] + ",", words[1] # Note that the "+" symbol indicates no spaces
#The comma not in parentheses indicates a space

Dies gibt zurück:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN, GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

1
Das Ändern der Datei funktioniert möglicherweise in einer einmaligen Situation. Wenn Sie jedoch Hunderte von Dateien haben, ist dies keine praktikable Lösung.
Craicerjack

0
with open(player_name, 'r') as myfile:
 data=myfile.readline()
 list=data.split(" ")
 word=list[0]

Dieser Code hilft Ihnen beim Lesen der ersten Zeile. Mit der Option Liste und Aufteilung können Sie das Wort in der ersten Zeile konvertieren, das durch das in einer Liste zu speichernde Leerzeichen getrennt ist.

Dann können Sie leicht auf jedes Wort zugreifen oder es sogar in einer Zeichenfolge speichern.

Dasselbe können Sie auch mit einer for-Schleife tun.


0
file = open("myfile.txt", "r")
lines = file.readlines()
str = ''                                     #string declaration

for i in range(len(lines)):
    str += lines[i].rstrip('\n') + ' '

print str

-1

Versuche Folgendes:

with open('data.txt', 'r') as myfile:
    data = myfile.read()

    sentences = data.split('\\n')
    for sentence in sentences:
        print(sentence)

Achtung: Das wird nicht entfernt \n. Es dient nur zum Anzeigen des Textes, als ob es keinen gäbe\n

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.