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?

klijo
quelle
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', '')
schlaflos
quelle
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()
Xiaoyu
quelle
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

Nafis Ahmad
quelle
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
50

Um alle Zeilen zu einer Zeichenfolge zusammenzufügen und neue Zeilen zu entfernen, verwende ich normalerweise:

with open('t.txt') as f:
  s = " ".join([x.strip() for x in f]) 
CONvid19
quelle
Es gibt UnicodeDecodeError in meinem Code Siehe diese stackoverflow.com/q/18649512/9339242
Arayan Singh
Möglicherweise müssen Sie die Zeichenkodierung angeben.
CONvid19
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', '')
Jonathan Sudiaman
quelle
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.

MagerValp
quelle
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()
Loochie
quelle
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
Wirbel
quelle
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()])
Chris Eberle
quelle
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
julianisch
quelle
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.

Sai Kiriti Badam
quelle
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
Michael Smith
quelle
3

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

_ = open('data.txt', 'r'); data = _.read(); _.close()
Edward D'Souza
quelle
2
f = open('data.txt','r')
string = ""
while 1:
    line = f.readline()
    if not line:break
    string += line

f.close()


print string
Hungneox
quelle
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) ]
gerardw
quelle
2

Hast du das versucht?

x = "yourfilename.txt"
y = open(x, 'r').read()

print(y)
Thorax Der PyChangeling
quelle
1
Das ist falsch. Sie möchten y = open (x, 'r'). Read (), wenn Sie es so machen wollen.
Katastic Voyage
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])

John Galbraith
quelle
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()

quelle
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']

Alex
quelle
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

Sma Ma
quelle
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
PyGuy
quelle
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.

Lakshaya Maheshwari
quelle
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
akD
quelle
-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

Palak Jain
quelle