¿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?



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', '')

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()

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


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


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', '')

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.


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()

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

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()])

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

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.


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

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()

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

f.close()


print string

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) ]


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])


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()

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


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í


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

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.


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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.