Como ler um arquivo de texto em uma variável de string e remover novas linhas?

964

Eu uso o seguinte segmento de código para ler um arquivo em python:

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

O arquivo de entrada é:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN
GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

e quando imprimo dados, recebo

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Pelo que vejo, os dados estão em listforma. Como faço para torná-lo string? E também como faço para remover os "\n", "["e "]"personagens a partir dele?

klijo
fonte
7
O título e a pergunta são inconsistentes. Você realmente quer se livrar do \ n também?
Julian
2
você realmente deseja remover as novas linhas do conteúdo do arquivo / string ou está confuso sobre os muitos meta-caracteres na saída de impressão e deseja realmente manter as novas linhas, mas não as exibe como "\ n"?
mnagel
11
Para aqueles que vêm aqui a partir de um motor de busca, provavelmente você está à procura de resposta de @ Xiaoyu
Jonathan Sudiaman

Respostas:

1321

Você poderia usar:

with open('data.txt', 'r') as file:
    data = file.read().replace('\n', '')
sleeplessnerd
fonte
66
Existe uma desvantagem em escrever apenas open("data.txt").read().replace('\n','')?
tuomassalo
262
Sim, sua versão não fecha explicitamente o arquivo, que será atrasado até que o coletor de lixo seja executado ou o programa seja encerrado. A instrução 'with' geralmente encapsula algumas ações de abertura / fechamento de configuração / desmontagem.
sleeplessnerd
12
Obrigado pelo esclarecimento. Portanto, parece que minha versão pode ser boa para pequenos scripts - mas, de preferência, o OTOH deve ser totalmente evitado para não torná-lo um hábito.
tuomassalo
10
@tuomassalo, é uma PITA enorme no processo de teste / depuração, pois não limpará os identificadores de arquivos abertos se você precisar finalizar prematuramente ou ocorrer uma exceção.
GoingTharn
13
Não, rstrip('\n')apenas removerá a nova linha da última linha e a replace('\n','')removerá em todos os lugares (essencialmente tornando o arquivo inteiro em uma linha)
sleeplessnerd
632

Use read(), não readline():

with open('data.txt', 'r') as myfile:
  data = myfile.read()
xiaoyu
fonte
6
Talvez, mas não tira novas linhas como o OP queria. Mesmo assim, gosto.
Randall Cozinhe
60
Se você estiver retornando uma única string, remover novas linhas não faz sentido - o OP deve escolher uma ou remover \ n das strings da lista.
Alex Dupuy
Funciona, mas não arquivos Unicode. Para dar suporte ao utf8 no python3, use um argumento extraencoding="utf-8"
FindOutIslamNow
2
Não estou entendendo por que essa solução foi publicada e também está recebendo muitos votos. É basicamente o mesmo que o aceito mais de um ano antes, e ainda está faltando a nova parte de remoção de linha, tornando isso ainda menos útil ..
nnsense
65

Você pode ler de um arquivo em uma linha:

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

Observe que isso não fecha o arquivo explicitamente.

O CPython fechará o arquivo quando sair como parte da coleta de lixo.

Mas outras implementações de python não. Para escrever código portátil, é melhor usar withou fechar o arquivo explicitamente. Curto nem sempre é melhor. Consulte https://stackoverflow.com/a/7396043/362951

Nafis Ahmad
fonte
32
Isso é anti-idiomático e não recomendado. opendeve ser usado dentro de uma with ... asdeclaração.
Jorge Leitão
1
@JC, você pode explicar o problema? Isso é apenas uma questão de costume ou a with ... asdeclaração traz alguma coisa?
Titou
4
@Titou a questão é que open.read () não fecha o arquivo, então precisamos with ... asou str.close()conforme demonstrado na resposta de Pedro. Mais sobre a importância de arquivos de fechamento aqui
JBallin
@JBallin. Esse idioma remove claramente uma fonte de erro. Obrigado !
Titou
3
isso também é ruim porque você acabou de sombra str()de builtins
Chris_Rands
50

Para unir todas as linhas em uma string e remover novas linhas, eu normalmente uso:

with open('t.txt') as f:
  s = " ".join([x.strip() for x in f]) 
CONvid19
fonte
É dar UnicodeDecodeError no meu código Veja este stackoverflow.com/q/18649512/9339242
Arayan Singh
pode ser necessário especificar a codificação de caracteres.
CONvid19
45

No Python 3.5 ou posterior, usando pathlib, você pode copiar o conteúdo do arquivo de texto em uma variável e fechar o arquivo em uma linha:

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

e então você pode usar str.replace para remover as novas linhas:

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

join () juntará uma lista de strings, e rstrip () sem argumentos cortará espaços em branco, incluindo novas linhas, no final das strings.

MagerValp
fonte
12

Isso pode ser feito usando o método read ():

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

Ou como o modo padrão em si é 'r' (leitura), basta usar,

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

Eu brinquei com isso por um tempo e prefiro usar readem combinação com rstrip. Sem rstrip("\n"), o Python adiciona uma nova linha ao final da string, o que na maioria dos casos não é muito útil.

with open("myfile.txt") as f:
    file_content = f.read().rstrip("\n")
    print file_content
turbilhão
fonte
6

É difícil dizer exatamente o que você procura, mas algo assim deve ajudá-lo:

with open ("data.txt", "r") as myfile:
    data = ' '.join([line.replace('\n', '') for line in myfile.readlines()])
Chris Eberle
fonte
reduzir (lambda x, y: x + y.rstrip ('\ n'), ['a \ n', "b \ n", 'c'], "") é muito mais interessante: D
sleeplessnerd
3
@Duncan, o que você sugeriria?
precisa
data = ' '.join(line.replace('\n', '') for line in myfile)ou a versão do MagerValp.
Duncan
6

Estou surpreso que ninguém splitlines()tenha mencionado ainda.

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

Variável dataagora é uma lista que se parece com esta quando impressa:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Observe que não há novas linhas ( \n).

Nesse ponto, parece que você deseja imprimir as linhas para o console, o que você pode obter com um loop for:

for line in data:
    print line
Julian
fonte
4

Você também pode retirar cada linha e concatenar em uma sequência final.

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

Isso também funcionaria bem.

Sai Kiriti Badam
fonte
Obrigado Pedro. Eu apenas adicionei por uma questão de compreensão.
Sai Kiriti Badam 02/09/19
3

você pode compactar isso em um em duas linhas de código !!!

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

se seu arquivo diz:

hello how are you?
who are you?
blank blank

saída python

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

Esta é uma solução passível de cópia de uma linha que também fecha o objeto de arquivo:

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

f.close()


print string
hungneox
fonte
2
Loops que possuem um string += linedevem ser evitados. Algumas versões do Python podem conseguir evitar o comportamento de O (n ^ 2) aqui, mas qualquer uma das outras respostas dadas é melhor que isso. Além disso, você não removeu as novas linhas que foram solicitados para que o seu código é apenas uma maneira muito lenta de fazerstring = f.read()
Duncan
Obrigado por me corrigir. Mas uma coisa pequena é que não preciso remover a nova linha, porque quando testei, ela não foi impressa '\ n'. @Duncan
hungneox
2

python3: o Google "comphrension da lista" se a sintaxe entre colchetes for nova para você.

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

Você já tentou isso?

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

print(y)
Thorax The PyChangeling
fonte
1
Isto está errado. Você quer y = open (x, 'r'). Read () se quiser fazer dessa maneira.
Katastic Voyage
1

Não acho que alguém tenha abordado a parte [] da sua pergunta. Quando você lê cada linha em sua variável, porque havia várias linhas antes de substituir o \ n por '', você acabou criando uma lista. Se você tiver uma variável de x e imprimi-la apenas

x

ou imprimir (x)

ou str (x)

Você verá a lista inteira com colchetes. Se você chamar cada elemento do (array de tipos)

x [0] então omite os colchetes. Se você usar a função str (), verá apenas os dados e também o ''. str (x [0])

John Galbraith
fonte
1

Talvez você possa tentar isso? Eu uso isso em meus programas.

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

fonte
1

A expressão regular também funciona:

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

print (l)

['Eu', 'sinto', 'vazio', 'e', ​​'morto', 'interior']

Alex
fonte
1

Para remover quebras de linha usando Python, você pode usar a replacefunção de uma string.

Este exemplo remove todos os três tipos de quebras de linha:

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

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

O arquivo de exemplo é:

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

Você pode experimentá-lo usando este cenário de reprodução:

https://repl.it/repls/AnnualJointHardware

insira a descrição da imagem aqui

Sma Ma
fonte
0

Isso funciona: Altere seu arquivo para:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

Então:

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

Isso cria uma lista chamada wordsigual a:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Isso se livrou do "\ n". Para responder à parte sobre os colchetes no seu caminho, faça o seguinte:

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

Ou:

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

Isso retorna:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN, GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE
PyGuy
fonte
1
Alterar o arquivo pode funcionar em uma situação pontual, mas se você tiver centenas de arquivos, isso simplesmente não será uma solução viável.
Craicerjack 3/03
0
with open(player_name, 'r') as myfile:
 data=myfile.readline()
 list=data.split(" ")
 word=list[0]

Esse código o ajudará a ler a primeira linha e, usando a opção list and split, você poderá converter a palavra da primeira linha separada por espaço para ser armazenada em uma lista.

Você pode acessar facilmente qualquer palavra ou até armazená-la em uma string.

Você também pode fazer o mesmo com o uso de um loop for.

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

Tente o seguinte:

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

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

Cuidado: Não remove o \n. É apenas para visualizar o texto como se não houvesse\n

Palak Jain
fonte