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

1149

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 obtengo

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

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

4
  • 12
    El título y la pregunta son inconsistentes. ¿De verdad quieres deshacerte de \ n también? Julian 18/07/2017 a las 10:11
  • 2
    ¿Realmente desea eliminar las líneas nuevas del contenido del archivo / cadena, o simplemente está confundido acerca de los muchos metacaracteres en su salida impresa y realmente desea mantener las líneas nuevas, pero no que se muestren como "\ n"? mnagel 5 dic 2017 a las 18:25
  • ¿Realmente desea leer todo el texto en una variable de cadena ? ¿Realmente quiere decir con "eliminar nuevas líneas" para reemplazarlas con una cadena vacía? Esto significaría que la última palabra de una línea y la primera palabra de la siguiente línea están unidas y no separadas. No conozco su caso de uso, pero este parece ser un requisito extraño. Podría tener otra respuesta si explica qué pretende hacer con los datos leídosgelonida 7 de enero a las 0:47
1616

Podrías usar:

with open('data.txt', 'r') as file:
    data = file.read().replace('\n', '')
14
  • 87
    ¿Hay alguna desventaja en simplemente escribir open("data.txt").read().replace('\n','')? tuomassalo 18/10/2013 a las 10:43
  • 328
    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 'with' generalmente encapsula algunas acciones de apertura / cierre de instalación / desmontaje. sleeplessnerd 18/10/2013 a las 13:38
  • 14
    Gracias por la aclaración. Entonces, parece que mi versión podría estar bien para scripts pequeños, pero OTOH, preferiblemente, debería evitarse por completo para no convertirla en un hábito. tuomassalo 20/10/2013 a las 17:18
  • 11
    @tuomassalo es un 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 24 oct 2013 a las 20:41
  • 14
    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 6 de julio de 2014 a las 8:00
115

En Python 3.5 o posterior, con 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', '')
1
  • 6
    Esta es hasta ahora la solución más elegante. Prefiero tener una solución de línea directa como read_file de RGang Su 27/09/20 a las 16:17
98

Puede leer de 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

5
  • 50
    Esto es antiidiomático y no se recomienda. opendebe usarse dentro de una with ... asdeclaración. Jorge Leitao 9 de enero de 2017 a las 10:27
  • 1
    @JC, ¿puedes explicar el problema? ¿Es esto solo una cuestión de costumbre o la with ... asdeclaración aporta algo? Titou 5 de mayo de 2017 a las 12:08 p.m.
  • 5
    @Titou, el problema es que open.read () no cierra el archivo, por lo que necesitamos with ... aso str.close()como se demuestra en la respuesta de Pedro. Más sobre la importancia de cerrar archivos aquíJBallin 18 de mayo de 2017 a las 21:01
  • @JBallin. Este idioma claramente elimina una fuente de error. Gracias ! Titou 19 de mayo de 2017 a las 8:15
  • 12
    esto también es malo porque acaba de sombrear los elementos str()incorporadosChris_Rands 13/08/19 a las 14:52
58

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

with open('t.txt') as f:
  s = " ".join([l.rstrip() for l in f]) 
3
  • 1
    Está dando UnicodeDecodeError en mi código Vea esto stackoverflow.com/q/18649512/9339242Arayan Singh 12/12/18 a las 13:59
  • es posible que deba especificar la codificación de caracteres. Pedro Lobito 11/02/19 a las 11:39
  • también eliminará los espacios en blanco finales, por lo que quizás sea mejors = " ".join([l.replace("\n", "") for l in f]) gelonida 7 de enero a la 1:00
32
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á los espacios en blanco, incluidas las nuevas líneas, desde el final de las cadenas.

0
17

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í es 'r' (lectura), simplemente use,

text_as_string = open('Your_Text_File.txt').read()
1
  • Tenga en cuenta que esto mantiene el archivo abierto indefinidamente. xtofl 22 abr a las 12:24
11

Me sorprende que nadie 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 nuevas líneas ( \n).

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

for line in data:
    print(line)
10

He estado jugando 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)
8

Es difícil saber exactamente lo que está buscando, pero algo como esto debería ayudarlo a comenzar:

with open ("data.txt", "r") as myfile:
    data = ' '.join([line.replace('\n', '') for line in myfile.readlines()])
3
  • reduce (lambda x, y: x + y.rstrip ('\ n'), ['a \ n', "b \ n", 'c'], "") es mucho más genial: Dsleeplessnerd 3/12/11 a las 18:26
  • 3
    @Duncan, ¿qué sugerirías? Chris Eberle 3/12/11 a las 20:20
  • data = ' '.join(line.replace('\n', '') for line in myfile)o la versión de MagerValp. Duncan 3/12/11 a las 21:12
4

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

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

si su archivo dice:

hello how are you?
who are you?
blank blank

salida de Python

hello how are you? who are you? blank blank
1
  • Me gusta esta solución ya que la última palabra de una línea estará separada por un espacio de la primera palabra de la siguiente línea. Sin embargo, sugeriría usar la withdeclaración. Entonces, algo como with open("filepath", "r") as fin: content = fin.read().replace("\n", " ") Pero si, por supuesto, no estoy seguro de si el póster original lo necesita ... gelonida 7 de ene a las 0:54
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.

2
  • data = data + line.strip();se puede reducir adata += line.strip();Pedro Lobito 5/10/20 a las 2:31
  • muy ineficiente para archivos grandes (se realizarán muchas asignaciones de memoria y copias de memoria. Es mejor crear una lista de líneas eliminadas y luego usar "" .join () `gelonida 7 de enero a las 1:04
3

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

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

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

 with open('data.txt') as f:
     lines = [ line.strip('\n') for line in list(f) ]
4
  • Muy pitónico y me funcionó bastante bien, aunque todavía no lo he probado en archivos grandes. ¡Gracias! stux 9 jul.20 a las 17:41
  • Voy a retractarme de mi voto a favor porque la tira también elimina los espacios en blanco, lo que puede no ser el comportamiento deseado. Sin embargo, sigo pensando que una versión modificada de esto sería buena. stux 9 jul.20 a las 19:37
  • lines = list(map(str.strip, f))? xtofl 22 de abril a las 12:28
  • actualizado para eliminar solo las nuevas líneasgerardw 23 abr a las 13:46
2

¿Has probado esto?

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

print(y)
1
  • 1
    Esto está mal. Quieres y = open (x, 'r'). Read () si lo vas a hacer de esa manera. Katastic Voyage 24 feb 2018 a las 8:27
2

Para eliminar los saltos de línea usando 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í

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

f.close()


print(string)
3
  • 2
    string += lineDeben evitarse los bucles que tengan un . Algunas versiones de Python pueden lograr evitar el comportamiento de O (n ^ 2) aquí, pero cualquiera de las otras respuestas que se han dado son mejores que esta. Además, no eliminó las líneas nuevas que se solicitaron, por lo que su código es solo una forma muy lenta de hacerlostring = f.read()Duncan 3 de diciembre de 2011 a las 17:41
  • Gracias por corregirme. Pero una pequeña cosa es que no tengo que eliminar la nueva línea, porque cuando probé, no imprimió '\ n'. @Duncanhungneox 3 de diciembre de 2011 a las 18:10
  • muy ineficaz para archivos de gran tamaño. para cada iteración, se debe asignar memoria y se deben copiar los datos. Además: la nueva línea no se elimina ni se reemplaza con un "" Intente usar el siguiente comando para ver que las nuevas líneas todavía están contenidas. print(repr(string))gelonida 7 de enero a las 0:58
1

No creo que nadie haya abordado la parte [] de su pregunta. Cuando leyó cada línea en su variable, debido a que había varias líneas antes de reemplazar \ n con '', terminó creando una lista. Si tiene una variable de xy la imprime con solo

X

o imprimir (x)

o str (x)

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

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

1

¿Quizás podrías probar esto? Yo uso esto 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()
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', 'and', 'dead', 'inside']

0
1

Un trazador de líneas:

  • Lista: "".join([line.rstrip('\n') for line in open('file.txt')])

  • Generador: "".join((line.rstrip('\n') for line in open('file.txt')))

La lista es más rápida que el generador, pero tiene más memoria. Los generadores son más lentos que las listas y son más livianos para la memoria, como iterar sobre líneas. En el caso de "" .join (), creo que ambos deberían funcionar bien. La función .join () debe eliminarse para obtener la lista o el generador respectivamente.

  • Nota: cerrar () / cerrar el descriptor de archivo probablemente no sea necesario
0

Esto funciona: cambie su archivo a:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

Luego:

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

Esto crea una lista denominada wordsque equivale a:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Eso eliminó el "\ n". Para responder a la parte sobre los corchetes 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
1
  • 1
    Cambiar el archivo puede funcionar en una situación única, pero si tiene cientos de archivos, esta no es una solución viable. Craicerjack 3/0317 a las 14:57
0
with open(player_name, 'r') as myfile:
 data=myfile.readline()
 list=data.split(" ")
 word=list[0]

Este código le 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.

De lo que 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.

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
0
0
with open('data.txt', 'r') as file:
    data = [line.strip('\n') for line in file.readlines()]
    data = ''.join(data)
0
-3

Intente 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

0