Come leggere un file di testo in una variabile stringa e rimuovere le righe?


964

Uso il seguente segmento di codice per leggere un file in Python:

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

Il file di input è:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN
GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

e quando stampo i dati ottengo

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Come vedo i dati sono in listforma. Come faccio a renderlo stringa? E anche come faccio a rimuovere le "\n", "["e "]"personaggi da esso?



7
Il titolo e la domanda sono incoerenti. Vuoi davvero sbarazzarti anche di \ n?
Giuliano

2
vuoi veramente rimuovere le nuove righe dal contenuto del file / stringa o sei solo confuso riguardo ai molti meta-caratteri nel tuo output di stampa e vuoi davvero mantenere le nuove righe, ma non visualizzarle come "\ n"?
mnagel,

11
A quelli che vengono qui da un motore di ricerca, probabilmente stai cercando la risposta di @ xiaoyu
Jonathan Sudiaman,

Risposte:


1321

Puoi usare:

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

66
C'è invece un aspetto negativo nella sola scrittura open("data.txt").read().replace('\n','')?
tuomassalo,

262
Sì, la tua versione non chiude esplicitamente il file, che verrà quindi ritardato fino all'esecuzione del Garbage Collector o al termine del programma. L'istruzione 'with' di solito incapsula alcune azioni di apertura / chiusura di installazione / smontaggio.
sleeplessnerd,

12
Grazie per il chiarimento. Quindi, sembra che la mia versione potrebbe essere ok per piccoli script - ma OTOH dovrebbe preferibilmente essere evitato del tutto per non farne un'abitudine.
tuomassalo,

10
@tuomassalo è un enorme PITA nel processo di test / debug, poiché non pulirà gli handle di file aperti se devi terminare prematuramente o si imbatte in un'eccezione.
GoingTharn

13
No, rstrip('\n')rimuoverà solo la nuova riga dall'ultima riga, la replace('\n','')rimuoverà ovunque (essenzialmente rendendo l'intero file una riga)
sleeplessnerd

632

Usa read(), non readline():

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

6
Forse, ma non toglie nuove righe come voleva l'OP. Mi piace ancora però.
Randall Cook,

60
Se stai restituendo una singola stringa, lo stripping di nuove righe non ha alcun senso: l'OP dovrebbe scegliere una stringa o stripped \ n dalle stringhe nell'elenco.
Alex Dupuy

Funziona ma non file Unicode. Per supportare utf8 su python3, usa un argomento in piùencoding="utf-8"
FindOutIslamNow

2
Non capisco perché questa soluzione sia stata pubblicata e sta ottenendo anche così tanti voti positivi. È praticamente lo stesso di quello accettato più di un anno prima e manca persino la nuova parte di stripping della linea, rendendola ancora meno utile ..
nnsense

65

Puoi leggere da un file in una riga:

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

Si noti che ciò non chiude esplicitamente il file.

CPython chiuderà il file quando esce come parte della garbage collection.

Ma altre implementazioni di Python no. Per scrivere un codice portatile, è meglio usare witho chiudere esplicitamente il file. Corto non è sempre meglio. Vedi https://stackoverflow.com/a/7396043/362951


32
Questo è anti-idiomatico e non raccomandato. opendovrebbe essere usato all'interno di una with ... asdichiarazione.
Jorge Leitao,

1
@JC puoi spiegare il problema? È solo una questione di costume o la with ... asfrase porta qualcosa?
Titou,

4
@Titou il problema è che open.read () non chiude il file, quindi abbiamo bisogno with ... aso str.close()come dimostrato nella risposta di Pedro. Maggiori informazioni sull'importanza di chiudere i file qui
JBallin,

@JBallin. Questo idioma rimuove chiaramente una fonte di errore. Grazie !
Titou,

3
anche questo è negativo perché hai appena oscurato str()dai builtin
Chris_Rands


45

In Python 3.5 o successivo, usando pathlib puoi copiare il contenuto del file di testo in una variabile e chiudere il file in una riga:

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

e quindi puoi usare str.replace per rimuovere le newline:

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

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

join () si unirà a un elenco di stringhe e rstrip () senza argomenti taglierà gli spazi bianchi, comprese le nuove righe, dalla fine delle stringhe.


12

Questo può essere fatto usando il metodo read ():

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

O poiché la modalità predefinita è "r" (leggi), quindi usa semplicemente,

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

9

Ho armeggiato per un po 'con questo e ho preferito usare l'uso readin combinazione con rstrip. Senza rstrip("\n"), Python aggiunge una nuova riga alla fine della stringa, che nella maggior parte dei casi non è molto utile.

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

6

È difficile dire esattamente cosa stai cercando, ma qualcosa del genere dovrebbe iniziare:

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

ridurre (lambda x, y: x + y.rstrip ('\ n'), ['a \ n', "b \ n", 'c'], "") è molto più interessante: D
sleeplessnerd

3
@Duncan cosa suggeriresti?
Chris Eberle,

data = ' '.join(line.replace('\n', '') for line in myfile)o la versione di MagerValp.
Duncan,

6

Sono sorpreso che nessuno abbia splitlines()ancora menzionato .

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

La variabile dataora è un elenco simile a questo quando viene stampato:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Nota che non ci sono newline ( \n).

A quel punto, sembra che tu voglia stampare le righe sulla console, cosa che puoi ottenere con un ciclo for:

for line in data:
    print line

4

Puoi anche eliminare ogni riga e concatenare in una stringa finale.

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

Anche questo funzionerebbe bene.


Grazie Pedro. L'ho appena aggiunto per motivi di comprensione.
Sai Kiriti Badam,

3

puoi comprimerlo in una in due righe di codice !!!

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

se il tuo file legge:

hello how are you?
who are you?
blank blank

uscita Python

hello how are you? who are you? blank blank

3

Questa è una soluzione copia-incollabile su una riga che chiude anche l'oggetto file:

_ = 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
I loop che hanno un string += linedovrebbero essere evitati. Alcune versioni di Python potrebbero riuscire a evitare il comportamento O (n ^ 2) qui, ma una qualsiasi delle altre risposte che sono state fornite è migliore di questa. Inoltre non hai rimosso le nuove righe richieste, quindi il tuo codice è solo un modo molto lento di farlostring = f.read()
Duncan,

Grazie per avermi corretto. Ma una piccola cosa è che non devo rimuovere la nuova linea, perché quando ho provato, non ha stampato '\ n'. @Duncan
hungneox,

2

python3: Google "list comphrension" se la sintassi della parentesi quadra è nuova per te.

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


1

Non credo che qualcuno abbia affrontato la parte [] della tua domanda. Quando hai letto ogni riga nella tua variabile, perché c'erano più righe prima di sostituire \ n con "" hai finito per creare un elenco. Se hai una variabile di x e stampala solo per

X

o stampa (x)

o str (x)

Vedrai l'intero elenco tra parentesi. Se chiamate ciascun elemento di (array of sort)

x [0] quindi omette le parentesi. Se usi la funzione str () vedrai solo i dati e non neanche "". str (x [0])


1

Forse potresti provare questo? Lo uso nei miei programmi.

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

1

Anche l'espressione regolare funziona:

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

print (l)

['I', 'feel', 'empty', 'and', 'dead', 'inside']


1

Per rimuovere le interruzioni di riga usando Python puoi usare la replacefunzione di una stringa.

In questo esempio vengono rimossi tutti e 3 i tipi di interruzioni di riga:

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

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

Il file di esempio è:

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

Puoi provarlo usando questo scenario di replay:

https://repl.it/repls/AnnualJointHardware

inserisci qui la descrizione dell'immagine


0

Funziona: cambia il tuo file in:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

Poi:

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

Questo crea un elenco chiamato wordsuguale a:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Che si è sbarazzato del "\ n". Per rispondere alla parte relativa alle parentesi che si frappongono, basta fare questo:

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

O:

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

Questo ritorna:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN, GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

1
La modifica del file potrebbe funzionare in una situazione una tantum, ma se hai centinaia di file questa non è una soluzione praticabile.
Craicerjack

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

Questo codice ti aiuterà a leggere la prima riga e quindi usando la lista e l'opzione divisa puoi convertire la prima riga della parola separata dallo spazio per essere memorizzata in un elenco.

Quindi puoi facilmente accedere a qualsiasi parola o persino memorizzarla in una stringa.

Puoi anche fare la stessa cosa usando un ciclo for.


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

Prova quanto segue:

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

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

Attenzione: non rimuove il \n. È solo per visualizzare il testo come se non ci fossero\n

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.