Leia apenas a primeira linha de um arquivo?


209

Como você obteria apenas a primeira linha de um arquivo como uma string com Python?


4
Se você já leu o arquivo ("Depois de ler em um arquivo"), já leu a primeira linha! (Assumindo que existe pelo menos uma linha.)
William Pursell

3
Observe que a pergunta como está agora redigida tem um significado diferente do que originalmente. Algumas respostas agora parecem bobas, pois levaram em conta a parte "depois de ler em um arquivo" (que foi removida).
31316 Peter Hansen

Respostas:


354

Use o .readline()método ( documentos Python 2 , documentos Python 3 ):

with open('myfile.txt') as f:
    first_line = f.readline()

Algumas notas:

  1. Conforme observado nos documentos, a menos que seja a única linha no arquivo, a sequência retornada f.readline()conterá uma nova linha à direita. Você pode usar f.readline().strip()para remover a nova linha.
  2. A withinstrução fecha automaticamente o arquivo novamente quando o bloco termina.
  3. A withinstrução funciona apenas no Python 2.5 e superior, e no Python 2.5 você precisa usarfrom __future__ import with_statement
  4. No Python 3, você deve especificar a codificação do arquivo que abrir. Consulte Mais informação...

3
No Python 3, se o arquivo for ascii ou utf8, você não precisará especificar a codificação do arquivo. E se não for, você deve especificar a codificação para codecs.open no Python 2 de qualquer maneira.
Evpok 19/07/12

2
@ Evpok "No Python 3, se o arquivo é ascii ou utf8, você não precisa especificar a codificação do arquivo" - se isso fosse estritamente verdadeiro! A realidade é um pouco mais confusa; conforme observado nos documentos, a codificação padrão usada depende da plataforma (e pode diferir até no mesmo computador, dependendo de como você inicia o Python - por exemplo, eu vi código que funcionava no meu shell normal, assumindo que o UTF-8 explodiu posteriormente quando executado através do Apache com mod_wsgi).
Mark Amery


20
fline=open("myfile").readline().rstrip()

Eu vim aqui procurando por isso. Especialmente porque rstrip()remove o caractere de nova linha.
Shashank Sawant

5
-1; isso não fecha o arquivo e retorna um resultado incorreto se a primeira linha contiver algum espaço em branco à direita, além do próprio caractere de nova linha.
Mark Amery

@ MarkAmery: Na verdade, como o identificador do arquivo não está atribuído a uma variável, ele é coletado imediatamente, o que fecha o arquivo. (Embora, é claro, a solução aceita usando um gerenciador de contexto é ainda muito melhor.)
ACDR

@acdr O que você diz é verdade para o CPython, mas não para outras implementações do Python - veja, por exemplo, os documentos de coleta de lixo do PyPy que mencionam como ponto de interesse específico que "os arquivos ... não são prontamente fechados quando ficam fora do escopo" . Por esse motivo, geralmente é discutido (por exemplo, em stackoverflow.com/a/7396043/1709587 ) que confiar no comportamento que você descreve é ​​uma má prática.
Mark Amery


9

Para voltar ao início de um arquivo aberto e retornar a primeira linha, faça o seguinte:

my_file.seek(0)
first_line = my_file.readline()

1
Apenas para entender melhor, seria "meu_arquivo.seek (0) line = meu_arquivo.readline ()"
Alberto Perez

7
first_line = next(open(filename))

1
Isso fecha o arquivo também?
abalter

Eventualmente, quando Python sai do bloco.
vy32

6

Muitas outras respostas aqui, mas para responder com precisão à pergunta que você fez (antes do @MarkAmery editar a pergunta original e alterar o significado):

>>> f = open('myfile.txt')
>>> data = f.read()
>>> # I'm assuming you had the above before asking the question
>>> first_line = data.split('\n', 1)[0]

Em outras palavras, se você já leu o arquivo (como você disse) e tem um grande bloco de dados na memória, para obter a primeira linha com eficiência, faça uma divisão () no caractere de nova linha, uma vez somente e pegue o primeiro elemento da lista resultante.

Observe que isso não inclui o \ncaractere no final da linha, mas suponho que você não o queira de qualquer maneira (e um arquivo de linha única pode nem ter um). Observe também que, embora seja bastante curto e rápido, ele faz uma cópia dos dados; portanto, para um blob de memória realmente grande, você pode não considerá-lo "eficiente". Como sempre, depende ...


8
Se este for um arquivo grande, o f.read () tentará carregar o arquivo inteiro na memória, o que não seria uma boa ideia. Uma alternativa seria ler um caractere de cada vez até que uma nova linha ou EOF seja encontrada
randomThought

Na verdade, todas as outras respostas são melhores alternativas que isso. Normalmente, a leitura de um arquivo com readline () e amigos carregaria blocos inteiros por vez, talvez 32K mais ou menos, e pesquisaria por ele para encontrar a próxima nova linha. Muito mais rápido e mais eficiente. Minha resposta seria útil apenas se ele já estiver carregando a coisa toda; nesse caso, podemos assumir que ele está bem em ter tudo na memória.
31512 Peter Hansen

2
Não estou convencido de que mudei o significado. Não faz sentido perguntar como "ler" a primeira linha de um arquivo depois de "ler" o arquivo inteiro. Como tal, é bastante óbvio para mim que a intenção do solicitante não era assumir que isso .read()deveria ser chamado primeiro.
Mark-Amery

@ MarkAmery, a pergunta era pouco formulada ("sem sentido"), então você adivinhou a intenção ("óbvio para mim") e a reformulou para corresponder. Minha interpretação é diferente. Claramente até e a menos que harpalss esclareça, tudo o que temos é o texto original mais a aceitação de uma resposta (ou seja, "busca (0)") que para mim mostra claramente que ele havia lido o arquivo, pelo menos após a primeira linha.
27416 Peter Hansen

você deve remover esta resposta. não é o caminho certo e pode enganar as pessoas.
thang 25/05

-15
f1 = open("input1.txt", "r")
print(f1.readline())

20
Existem várias respostas com mais de cinco anos que contêm exatamente essa abordagem . Você está fazendo nada além de criar ruído adicionando outro.
Mark Amery
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.