Como leio todas as linhas de um arquivo no Python e armazeno cada linha como um elemento em uma lista?
Quero ler o arquivo linha por linha e anexar cada linha ao final da lista.
with open(filename) as f:
content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content]
file.readlines()
em umfor
loop, um objeto de arquivo em si é suficiente:lines = [line.rstrip('\n') for line in file]
readlines()
não é muito eficiente, pois pode resultar em MemoryError . Nesse caso, é melhor iterar sobre o arquivo usandofor line in f:
e trabalhando com cadaline
variável..rstrip()
funcionará um pouco mais rápido se você estiver removendo os espaços em branco do final das linhas.with open(filename) as f: content = [i.strip() for i in f.readlines()]
Consulte Entrada e Saída :
ou com a remoção do caractere de nova linha:
fonte
f.read().splitlines()
, que faz novas linhas removefor line in open(filename)
segura? Ou seja, o arquivo será fechado automaticamente?lines = [x.rstrip('\n') for x in open('data\hsf.txt','r')]
Se eu escrever dessa maneira, como posso fechar o arquivo após a leitura?open
sem o gerenciador de contexto (ou alguma outra maneira garantida de fechá-lo), esse não é realmente um desses casos - quando o objeto não tem mais referências para ele será coletado o lixo e o arquivo será fechado, o que deve ocorrer imediatamente com erro ou não, quando a compreensão da lista for concluída.Isso é mais explícito do que o necessário, mas faz o que você deseja.
fonte
array
, mas pode haver outras circunstâncias). Certamente para arquivos grandes, essa abordagem pode atenuar problemas.Isso produzirá uma "matriz" de linhas do arquivo.
open
retorna um arquivo que pode ser iterado. Quando você itera sobre um arquivo, obtém as linhas desse arquivo.tuple
pode usar um iterador e instanciar uma instância de tupla para você a partir do iterador fornecido.lines
é uma tupla criada a partir das linhas do arquivo.fonte
lines = open(filename).read().split('\n')
vez disso.lines = open(filename).read().splitlines()
um pouco mais limpo e acredito que ele também lida melhor com as terminações de linha do DOS.list
ocupa cerca de 13,22% mais espaço que umtuple
. Os resultados vêmfrom sys import getsizeof as g; i = [None] * 1000; round((g(list(i)) / g(tuple(i)) - 1) * 100, 2)
. Criar umtuple
leva cerca de 4,17% mais tempo do que criar umlist
(com um desvio padrão de 0,16%). Os resultados vêm da execuçãofrom timeit import timeit as t; round((t('tuple(i)', 'i = [None] * 1000') / t('list(i)', 'i = [None] * 1000') - 1) * 100, 2)
30 vezes. Minha solução favorece o espaço sobre a velocidade quando a necessidade de mutabilidade é desconhecida.Se você deseja
\n
incluir:Se você não deseja
\n
incluir:fonte
De acordo com os Métodos de objetos de arquivo do Python , a maneira mais simples de converter um arquivo de texto em um
list
é:Se você apenas precisar percorrer as linhas do arquivo de texto, poderá usar:
Resposta antiga:
Usando
with
ereadlines()
:Se você não se importa em fechar o arquivo, esta linha única funciona:
A maneira tradicional :
fonte
Você pode simplesmente fazer o seguinte, como foi sugerido:
Observe que essa abordagem tem duas desvantagens:
1) Você armazena todas as linhas na memória. No caso geral, essa é uma péssima idéia. O arquivo pode ser muito grande e você pode ficar sem memória. Mesmo que não seja grande, é simplesmente um desperdício de memória.
2) Isso não permite o processamento de cada linha enquanto você as lê. Portanto, se você processar suas linhas depois disso, não será eficiente (requer duas passagens em vez de uma).
Uma abordagem melhor para o caso geral seria a seguinte:
Onde você define sua função do processo da maneira que desejar. Por exemplo:
(A implementação da
Superman
classe é deixada como um exercício para você).Isso funcionará bem para qualquer tamanho de arquivo e você o analisará em apenas 1 passagem. Normalmente, é assim que os analisadores genéricos funcionam.
fonte
open('file_path', 'r+')
Dados na lista
Suponha que tenhamos um arquivo de texto com nossos dados, como nas linhas a seguir,
Conteúdo do arquivo de texto:
python
e, no intérprete, escreva:O script Python:
Usando anexar:
Ou:
Ou:
Ou:
resultado:
fonte
read().splitlines()
é fornecido pelo Python: é simplesreadlines()
(o que provavelmente é mais rápido, pois é menos dispendioso).read().splitlines()
ereadlines()
não produz a mesma saída. Tem certeza de que eles são equivalentes?strip()
deve serrstrip("\n")
ou espaços em torno de uma linha são excluídos. Além disso, não há sentido em fazerreadlines()
uma compreensão de lista: simplesmente iterar sobre o arquivo é melhor, pois não desperdiça tempo e memória criando uma lista intermediária das linhas.Para ler um arquivo em uma lista, você precisa fazer três coisas:
Felizmente, o Python torna muito fácil fazer essas coisas; portanto, a maneira mais curta de ler um arquivo em uma lista é:
No entanto, vou adicionar mais algumas explicações.
Abrindo o arquivo
Presumo que você deseja abrir um arquivo específico e não lida diretamente com um identificador de arquivo (ou um identificador de arquivo). A função mais usada para abrir um arquivo no Python é o seguinte
open
: é necessário um argumento obrigatório e dois opcionais no Python 2.7:O nome do arquivo deve ser uma sequência que representa o caminho para o arquivo . Por exemplo:
Observe que a extensão do arquivo precisa ser especificada. Isso é especialmente importante para usuários do Windows, porque extensões de arquivo como
.txt
ou.doc
etc. estão ocultas por padrão. quando exibidas no explorer.O segundo argumento é o
mode
, ér
por padrão o que significa "somente leitura". É exatamente isso que você precisa no seu caso.Mas caso você realmente queira criar um arquivo e / ou gravar em um arquivo, precisará de um argumento diferente aqui. Existe uma excelente resposta se você quiser uma visão geral .
Para ler um arquivo, você pode omitir
mode
ou passá-lo explicitamente:Ambos abrirão o arquivo no modo somente leitura. Caso você queira ler um arquivo binário no Windows, use o modo
rb
:Em outras plataformas, o
'b'
(modo binário) é simplesmente ignorado.Agora que mostrei como
open
o arquivo, vamos falar sobre o fato de que você sempre precisaclose
novamente. Caso contrário, ele manterá um identificador de arquivo aberto até que o processo termine (ou o Python retarda o identificador de arquivo).Enquanto você pode usar:
Isso falhará ao fechar o arquivo quando algo entre
open
eclose
lança uma exceção. Você pode evitar isso usando umtry
efinally
:No entanto, o Python fornece gerenciadores de contexto com uma sintaxe mais bonita (mas
open
é quase idêntica àtry
efinally
acima):A última abordagem é a abordagem recomendada para abrir um arquivo no Python!
Lendo o arquivo
Ok, você abriu o arquivo, agora como lê-lo?
A
open
função retorna umfile
objeto e suporta o protocolo de iteração Pythons. Cada iteração fornecerá uma linha:Isso imprimirá cada linha do arquivo. Observe, no entanto, que cada linha conterá um caractere de nova linha
\n
no final (você pode verificar se o seu Python é construído com suporte universal a novas linhas - caso contrário, você também pode ter\r\n
no Windows ou\r
no Mac como novas linhas). Se você não quiser, pode simplesmente remover o último caractere (ou os dois últimos caracteres no Windows):Mas a última linha não tem necessariamente uma nova linha à direita, portanto, não se deve usá-la. Pode-se verificar se termina com uma nova linha à direita e, em caso afirmativo, removê-la:
Mas você pode simplesmente remover todos os espaços em branco (incluindo o
\n
caractere) do final da string , isso também removerá todos os outros espaços em branco à direita, para que você tenha cuidado se estes forem importantes:No entanto, se as linhas terminarem com
\r\n
(Windows "newlines"), isso.rstrip()
também cuidará do\r
!Armazene o conteúdo como lista
Agora que você sabe como abrir o arquivo e lê-lo, é hora de armazenar o conteúdo em uma lista. A opção mais simples seria usar a
list
função:Caso deseje remover as novas linhas à direita, use uma compreensão da lista:
Ou ainda mais simples: o
.readlines()
método dofile
objeto, por padrão, retorna umalist
das linhas:Isso também inclui os caracteres de nova linha à direita. Se você não os quiser, eu recomendaria o
[line.rstrip() for line in f]
abordagem, pois evita manter duas listas contendo todas as linhas na memória.Há uma opção adicional para obter a saída desejada, porém é "subótima":
read
o arquivo completo em uma string e depois dividido em novas linhas:ou:
Eles cuidam das novas linhas à direita automaticamente porque o
split
personagem não está incluído. No entanto, eles não são ideais porque você mantém o arquivo como string e como uma lista de linhas na memória!Sumário
with open(...) as f
ao abrir arquivos porque você não precisa fechar o arquivo sozinho e ele fecha o arquivo mesmo que ocorra alguma exceção.file
objetos suportam o protocolo de iteração, portanto, ler um arquivo linha por linha é tão simples quantofor line in the_file_object:
.readlines()
mas se você quiser processar as linhas antes de armazená-las na lista, eu recomendaria uma compreensão simples da lista.fonte
Maneira limpa e pitônica de ler as linhas de um arquivo em uma lista
Em primeiro lugar, você deve se concentrar em abrir seu arquivo e ler seu conteúdo de maneira eficiente e pitônica. Aqui está um exemplo da maneira que eu pessoalmente NÃO prefiro:
Em vez disso, prefiro o método abaixo de abrir arquivos para leitura e gravação, pois é muito limpo e não requer uma etapa extra para fechar o arquivo quando você terminar de usá-lo. Na declaração abaixo, estamos abrindo o arquivo para leitura e atribuindo-o à variável 'infile'. Depois que o código nesta instrução terminar a execução, o arquivo será fechado automaticamente.
Agora, precisamos nos concentrar em trazer esses dados para uma lista Python, porque eles são iteráveis, eficientes e flexíveis. No seu caso, o objetivo desejado é trazer cada linha do arquivo de texto para um elemento separado. Para fazer isso, usaremos o método splitlines () da seguinte maneira:
O produto final:
Testando nosso código:
fonte
Introduzido no Python 3.4,
pathlib
possui um método realmente conveniente para ler texto de arquivos, da seguinte maneira:(A
splitlines
chamada é o que a transforma de uma sequência que contém todo o conteúdo do arquivo para uma lista de linhas no arquivo).pathlib
tem muitas conveniências úteis nele.read_text
é agradável e conciso, e você não precisa se preocupar em abrir e fechar o arquivo. Se tudo o que você precisa fazer com o arquivo é ler tudo de uma só vez, é uma boa escolha.fonte
Aqui está mais uma opção usando a compreensão da lista em arquivos;
Essa deve ser a maneira mais eficiente, pois a maior parte do trabalho é feita dentro do interpretador Python.
fonte
rstrip()
potencialmente retira todo o espaço em branco à direita, não apenas o\n
; use.rstrip('\n')
.Agora a variável out é uma lista (matriz) do que você deseja. Você pode fazer:
Ou:
Você obterá os mesmos resultados.
fonte
Leia e grave arquivos de texto com Python 2 e Python 3; trabalha com Unicode
Coisas a serem observadas:
with
é o chamado gerenciador de contexto . Ele garante que o arquivo aberto seja fechado novamente..strip()
ou.rstrip()
deixarão de reproduzir,lines
como também retiram o espaço em branco.Finais de arquivos comuns
.txt
Gravação / leitura de arquivos mais avançadas
Para seu aplicativo, o seguinte pode ser importante:
Consulte também: Comparação de formatos de serialização de dados
Caso você esteja procurando uma maneira de criar arquivos de configuração, leia meu pequeno artigo Arquivos de configuração em Python .
fonte
Outra opção é
numpy.genfromtxt
, por exemplo:Isso criará
data
uma matriz NumPy com tantas linhas quanto o seu arquivo.fonte
Se você deseja ler um arquivo na linha de comando ou no stdin, também pode usar o
fileinput
módulo:Passe os arquivos para ele da seguinte maneira:
Leia mais aqui: http://docs.python.org/2/library/fileinput.html
fonte
A maneira mais simples de fazer isso
Uma maneira simples é:
Em uma linha, isso daria:
No entanto, essa é uma maneira bastante ineficiente, pois armazenará 2 versões do conteúdo na memória (provavelmente não é um grande problema para arquivos pequenos, mas ainda assim). [Obrigado Mark Amery].
Existem 2 maneiras mais fáceis:
pathlib
para criar um caminho para o seu arquivo que você poderia usar para outras operações no seu programa:fonte
.read().splitlines()
não é "mais simples" do que apenas ligar.readlines()
. Por outro, é ineficiente em memória; você está desnecessariamente armazenando duas versões do conteúdo do arquivo (a única string retornada por.read()
e a lista de strings retornadas porsplitlines()
) na memória de uma só vez.Basta usar as funções splitlines (). Aqui está um exemplo.
Na saída, você terá a lista de linhas.
fonte
.readlines()
. Isso coloca duas cópias do conteúdo do arquivo na memória de uma só vez (uma como uma única cadeia enorme, uma como uma lista de linhas).Se você deseja encontrar um arquivo muito grande / grande e deseja ler mais rapidamente (imagine que você esteja em uma competição de codificação Topcoder / Hackerrank), pode ler um pedaço consideravelmente maior de linhas em um buffer de memória ao mesmo tempo, em vez de apenas itere linha por linha no nível do arquivo.
fonte
process(line)
é uma função que você precisa implementar para processar os dados. por exemplo, em vez dessa linha, se você usarprint(line)
, ela imprimirá cada linha do lines_buffer.As maneiras mais fáceis de fazer isso com alguns benefícios adicionais são:
ou
ou
No caso de
set
, devemos lembrar que não temos a ordem das linhas preservada e nos livramos das linhas duplicadas.Abaixo, adicionei um importante complemento do @MarkAmery :
fonte
.close
o objeto de arquivo nem está usando umawith
instrução, em algumas implementações do Python o arquivo pode não ser fechado após a leitura e seu processo vazará um identificador de arquivo aberto. No CPython (a implementação normal do Python usada pela maioria das pessoas), isso não é um problema, já que o objeto do arquivo é imediatamente coletado pelo lixo e isso fecha o arquivo, mas, no entanto, geralmente é considerado uma boa prática fazer algo comowith open('filename') as f: lines = list(f)
garantir que o arquivo é fechado independentemente da implementação do Python que você está usando.Usa isto:
data
é um tipo de quadro de dados e usa valores para obter ndarray. Você também pode obter uma lista usandoarray.tolist()
.fonte
pandas.read_csv()
é para ler dados CSV , como é apropriado aqui?Esboço e Resumo
Com a
filename
, manipulando o arquivo de umPath(filename)
objeto ou diretamente comopen(filename) as f
, execute um dos seguintes procedimentos:list(fileinput.input(filename))
with path.open() as f
, liguef.readlines()
list(f)
path.read_text().splitlines()
path.read_text().splitlines(keepends=True)
fileinput.input
ouf
elist.append
cada uma linha de cada vezf
para um limitelist.extend
métodof
em uma compreensão de listaEu explico o caso de uso de cada um abaixo.
Esta é uma excelente pergunta. Primeiro, vamos criar alguns dados de exemplo:
Os objetos de arquivo são iteradores preguiçosos; portanto, apenas itere sobre ele.
Como alternativa, se você tiver vários arquivos, use
fileinput.input
outro iterador lento. Com apenas um arquivo:ou para vários arquivos, passe uma lista de nomes de arquivos:
Novamente,
f
efileinput.input
acima, ambos são / retornam iteradores preguiçosos. Você só pode usar um iterador uma vez; portanto, para fornecer código funcional e evitar a verbosidade, usarei o que é um pouco mais concisofileinput.input(filename)
a partir daqui.Ah, mas você quer isso em uma lista por algum motivo? Eu evitaria isso, se possível. Mas se você insistir ... basta passar o resultado de
fileinput.input(filename)
paralist
:Outra resposta direta é a chamada
f.readlines
, que retorna o conteúdo do arquivo (até umhint
número opcional de caracteres, para que você possa dividi-lo em várias listas dessa maneira).Você pode acessar esse objeto de arquivo de duas maneiras. Uma maneira é passar o nome do arquivo para o
open
built-in:ou usando o novo objeto Path do
pathlib
módulo (do qual me apaixonei e utilizarei daqui em diante):list
também consumirá o iterador de arquivos e retornará uma lista - um método bastante direto:Se você não se importa de ler o texto inteiro na memória como uma única string antes de dividi-la, faça isso como uma linha com o
Path
objeto e osplitlines()
método string. Por padrão,splitlines
remove as novas linhas:Se você deseja manter as novas linhas, passe
keepends=True
:Agora, isso é um pouco tolo de pedir, já que demonstramos o resultado final facilmente com vários métodos. Mas pode ser necessário filtrar ou operar nas linhas à medida que você faz sua lista, portanto, vamos aceitar essa solicitação.
O uso
list.append
permitiria filtrar ou operar em cada linha antes de anexá-la:Usar
list.extend
seria um pouco mais direto e talvez útil se você tiver uma lista preexistente:Ou, mais lingüisticamente, poderíamos usar uma compreensão de lista e mapear e filtrar dentro dela, se desejável:
Ou ainda mais diretamente, para fechar o círculo, basta passar para a lista para criar uma nova lista diretamente sem operar nas linhas:
Conclusão
Você já viu várias maneiras de inserir linhas de um arquivo em uma lista, mas eu recomendo que você evite materializar grandes quantidades de dados em uma lista e, em vez disso, use a iteração lenta do Python para processar os dados, se possível.
Ou seja, prefira
fileinput.input
ouwith path.open() as f
.fonte
Caso também existam linhas vazias no documento, gosto de ler o conteúdo e passá-lo
filter
para evitar elementos de string vaziosfonte
Você também pode usar o comando loadtxt no NumPy. Isso verifica menos condições que o genfromtxt, portanto, pode ser mais rápido.
fonte
Eu gosto de usar o seguinte. Lendo as linhas imediatamente.
Ou usando a compreensão da lista:
fonte
readlines()
, o que gera uma penalidade de memória. Você pode simplesmente removê-lo, pois a iteração sobre um arquivo (texto) fornece cada linha por vez.with
instrução para abrir (e fechar implicitamente) o arquivo.Eu tentaria um dos métodos abaixo mencionados. O arquivo de exemplo que eu uso tem o nome
dummy.txt
. Você pode encontrar o arquivo aqui . Presumo que o arquivo esteja no mesmo diretório que o código (você pode alterarfpath
para incluir o nome do arquivo e o caminho da pasta adequados).Nos exemplos abaixo mencionados, a lista que você deseja é fornecida por
lst
.1.> Primeiro método :
2.> No segundo método , pode-se usar o módulo csv.reader da Python Standard Library :
Você pode usar um dos dois métodos. O tempo necessário para a criação de
lst
é quase igual nos dois métodos.fonte
delimiter=' '
argumento?Aqui está uma classe de
bibliotecaauxiliar Python (3) que eu uso para simplificar a E / S do arquivo:Você usaria a
FileIO.lines
função, assim:Lembre-se de que os parâmetros
mode
("r"
por padrão) efilter_fn
(verifica se há linhas vazias por padrão) são opcionais.Você pode até mesmo remover as
read
,write
edelete
métodos e apenas deixar oFileIO.lines
, ou mesmo transformá-lo em um método separado chamadoread_lines
.fonte
lines = FileIO.lines(path)
realmente mais simples dowith open(path) as f: lines = f.readlines()
que justificar a existência desse ajudante? Você economiza 17 caracteres por chamada. (E na maioria das vezes, por motivos de desempenho e memória, você desejará repetir um objeto de arquivo diretamente, em vez de ler suas linhas em uma lista de qualquer maneira, para que você nem queira usá-lo com frequência!) muitas vezes é fã de criar poucas funções utilitárias, mas essa me parece que está criando desnecessariamente uma nova maneira de escrever algo que já é curto e fácil com a biblioteca padrão.Versão da linha de comando
Correr com:
fonte