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 já 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.