¿Cómo leer un archivo de texto en una variable de cadena y eliminar nuevas líneas?

964

Utilizo el siguiente segmento de código para leer un archivo en python:

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

El archivo de entrada es:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN
GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

y cuando imprimo datos me sale

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Como veo los datos están en listforma. ¿Cómo lo hago cadena? Y también cómo puedo eliminar las "\n", "["y "]"personajes de ella?

klijo
fuente
77
El título y la pregunta son inconsistentes. ¿Realmente quieres deshacerte de la \ n también?
Julian
2
¿realmente desea eliminar las nuevas líneas del contenido del archivo / cadena, o simplemente está confundido acerca de los muchos metacaracteres en su salida de impresión y realmente desea mantener las nuevas líneas, pero no hacer que se muestren como "\ n"?
mnagel
11
Para aquellos que vienen aquí desde un motor de búsqueda, probablemente estén buscando la respuesta de @ xiaoyu
Jonathan Sudiaman el

Respuestas:

1323

Podrías usar:

with open('data.txt', 'r') as file:
    data = file.read().replace('\n', '')
insomnio
fuente
67
¿Hay un inconveniente en solo escribir en su open("data.txt").read().replace('\n','')lugar?
tuomassalo
263
Sí, su versión no cierra explícitamente el archivo, que luego se retrasará hasta que se ejecute el recolector de basura o el programa finalice. La declaración 'con' generalmente encapsula algunas acciones de apertura / cierre de configuración / desmontaje.
sleeplessnerd
12
Gracias por la aclaración. Entonces, parece que mi versión podría estar bien para scripts pequeños, pero OTOH debería evitarse por completo para que no sea un hábito.
tuomassalo
10
@tuomassalo es una gran PITA en el proceso de prueba / depuración, ya que no limpiará los identificadores de archivos abiertos si tiene que terminar prematuramente o se encuentra con una excepción.
GoingTharn
13
No, rstrip('\n')solo eliminará la nueva línea de la última línea, la replace('\n','')eliminará en todas partes (esencialmente haciendo que todo el archivo sea una línea)
sleeplessnerd
632

Uso read(), no readline():

with open('data.txt', 'r') as myfile:
  data = myfile.read()
xiaoyu
fuente
66
Quizás, pero no elimina las nuevas líneas como quería el OP. Sin embargo, todavía me gusta.
Randall Cook
6060
Si está devolviendo una sola cadena, quitar líneas nuevas no tiene ningún sentido: el OP debe elegir una cadena o quitar \ n de las cadenas de la lista.
Alex Dupuy
Funciona pero no archivos Unicode. Para admitir utf8 en python3, use un argumento adicionalencoding="utf-8"
FindOutIslamNow
2
No entiendo por qué se ha publicado esta solución y también está recibiendo tantos votos positivos. Es básicamente el mismo que el aceptado más de un año antes, y es aún falta la nueva línea de decapado parte, haciendo de este aún menos útil ..
nnsense
65

Puede leer desde un archivo en una línea:

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

Tenga en cuenta que esto no cierra el archivo explícitamente.

CPython cerrará el archivo cuando salga como parte de la recolección de basura.

Pero otras implementaciones de Python no lo harán. Para escribir código portátil, es mejor usar witho cerrar el archivo explícitamente. Corto no siempre es mejor. Ver https://stackoverflow.com/a/7396043/362951

Nafis Ahmad
fuente
32
Esto es anti-idiomático y no se recomienda. opendebe usarse dentro de una with ... asdeclaración.
Jorge Leitao
1
@JC, ¿puedes explicar el problema? ¿Es solo una cuestión de costumbre o la with ... asdeclaración aporta algo?
Titou
44
@Titou, el problema es que open.read () no cierra el archivo, por lo que necesitamos with ... aso str.close()como se demostró en la respuesta de Pedro. Más sobre la importancia de cerrar archivos aquí
JBallin
@JBallin. Este modismo elimina claramente una fuente de error. Gracias !
Titou
3
esto también es malo porque te acabas str()de dejar de construir
Chris_Rands
50

Para unir todas las líneas en una cadena y eliminar nuevas líneas, normalmente uso:

with open('t.txt') as f:
  s = " ".join([x.strip() for x in f]) 
CONvid19
fuente
Está dando UnicodeDecodeError en mi código Ver esto stackoverflow.com/q/18649512/9339242
Arayan Singh
Es posible que deba especificar la codificación de caracteres.
CONvid19
45

En Python 3.5 o posterior, usando pathlib puede copiar el contenido del archivo de texto en una variable y cerrar el archivo en una línea:

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

y luego puede usar str.replace para eliminar las nuevas líneas:

txt = txt.replace('\n', '')
Jonathan Sudiaman
fuente
31
with open("data.txt") as myfile:
    data="".join(line.rstrip() for line in myfile)

join () se unirá a una lista de cadenas, y rstrip () sin argumentos recortará espacios en blanco, incluidas las nuevas líneas, desde el final de las cadenas.

MagerValp
fuente
12

Esto se puede hacer usando el método read ():

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

O como el modo predeterminado en sí mismo es 'r' (lectura), simplemente use,

text_as_string = open('Your_Text_File.txt').read()
Loochie
fuente
9

He jugado un poco con esto por un tiempo y prefiero usarlo readen combinación con rstrip. Sin rstrip("\n"), Python agrega una nueva línea al final de la cadena, que en la mayoría de los casos no es muy útil.

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

Es difícil saber exactamente lo que buscas, pero algo como esto debería ayudarte a comenzar:

with open ("data.txt", "r") as myfile:
    data = ' '.join([line.replace('\n', '') for line in myfile.readlines()])
Chris Eberle
fuente
reduce (lambda x, y: x + y.rstrip ('\ n'), ['a \ n', "b \ n", 'c'], "") está mucho más fresco: D
sleeplessnerd
3
@Duncan, ¿qué sugerirías?
Chris Eberle
data = ' '.join(line.replace('\n', '') for line in myfile)o la versión de MagerValp.
Duncan
6

Me sorprende que nadie lo haya mencionado splitlines()todavía.

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

La variable dataahora es una lista que se ve así cuando se imprime:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Tenga en cuenta que no hay líneas nuevas ( \n).

En ese momento, parece que desea imprimir las líneas a la consola, lo que puede lograr con un bucle for:

for line in data:
    print line
Julian
fuente
4

También puede quitar cada línea y concatenar en una cadena final.

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

Esto también funcionaría bien.

Sai Kiriti Badam
fuente
Gracias pedro Lo acabo de agregar por el bien de la comprensión.
Sai Kiriti Badam
3

¡puedes comprimir esto en una en dos líneas de código!

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

si su archivo lee:

hello how are you?
who are you?
blank blank

salida de python

hello how are you? who are you? blank blank
Michael Smith
fuente
3

Esta es una solución de una línea, que se puede copiar y pegar, que también cierra el objeto del archivo:

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

f.close()


print string
hungneox
fuente
2
string += lineDeben evitarse los bucles que tienen un . Algunas versiones de Python pueden evitar el comportamiento O (n ^ 2) aquí, pero cualquiera de las otras respuestas que se han dado es mejor que esto. Además, no eliminó las nuevas líneas solicitadas, por lo que su código es una forma muy lenta de hacerlostring = f.read()
Duncan
Gracias por corregirme. Pero una pequeña cosa es que no tengo que eliminar la nueva línea, porque cuando probé, no imprimió '\ n'. @Duncan
hungneox
2

python3: "lista de comprensión" de Google si la sintaxis de corchetes es nueva para usted.

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

¿Has probado esto?

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

print(y)
Tórax El PyChangeling
fuente
1
Esto está mal. Desea y = abrir (x, 'r'). Leer () si va a hacerlo de esa manera.
Katastic Voyage
1

No creo que nadie haya abordado la [] parte de su pregunta. Cuando lees cada línea en tu variable, porque había varias líneas antes de reemplazar el \ n con '' terminaste creando una lista. Si tiene una variable de x e imprima con solo

X

o imprimir (x)

o str (x)

Verá la lista completa con los corchetes. Si llama a cada elemento del (conjunto de tipos)

x [0] luego omite los corchetes. Si usa la función str () verá solo los datos y no el '' tampoco. str (x [0])

John Galbraith
fuente
1

¿Quizás podrías probar esto? Lo uso en mis programas.

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

fuente
1

La expresión regular también funciona:

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

print (l)

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

Alex
fuente
1

Para eliminar saltos de línea con Python, puede usar la replacefunción de una cadena.

Este ejemplo elimina los 3 tipos de saltos de línea:

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

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

El archivo de ejemplo es:

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

Puedes probarlo usando este escenario de repetición:

https://repl.it/repls/AnnualJointHardware

ingrese la descripción de la imagen aquí

Sma Ma
fuente
0

Esto funciona: cambie su archivo a:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

Entonces:

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

Esto crea una lista llamada wordsque es igual a:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Eso eliminó el "\ n". Para responder la parte sobre los paréntesis que se interponen en su camino, simplemente haga esto:

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

Esto devuelve:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN, GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE
PyGuy
fuente
1
Cambiar el archivo podría funcionar en una situación única, pero si tiene cientos de archivos, esta no es una solución viable.
Craicerjack
0
with open(player_name, 'r') as myfile:
 data=myfile.readline()
 list=data.split(" ")
 word=list[0]

Este código lo ayudará a leer la primera línea y luego, utilizando la opción de lista y división, puede convertir la palabra de la primera línea separada por espacio para almacenarla en una lista.

Entonces puede acceder fácilmente a cualquier palabra, o incluso almacenarla en una cadena.

También puede hacer lo mismo con el uso de un bucle for.

Lakshaya Maheshwari
fuente
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
fuente
-1

Intenta lo siguiente:

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

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

Precaución: no elimina el \n . Es solo para ver el texto como si no hubiera\n

Palak Jain
fuente