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).
with open('myfile.txt')as f:
first_line = f.readline()
Algumas notas:
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.
A withinstrução fecha automaticamente o arquivo novamente quando o bloco termina.
A withinstrução funciona apenas no Python 2.5 e superior, e no Python 2.5 você precisa usarfrom __future__ import with_statement
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).
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.
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 ...
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.
Respostas:
Use o
.readline()
método ( documentos Python 2 , documentos Python 3 ):Algumas notas:
f.readline()
conterá uma nova linha à direita. Você pode usarf.readline().strip()
para remover a nova linha.with
instrução fecha automaticamente o arquivo novamente quando o bloco termina.with
instrução funciona apenas no Python 2.5 e superior, e no Python 2.5 você precisa usarfrom __future__ import with_statement
fonte
mod_wsgi
).fonte
with
é melhor.fonte
rstrip()
remove o caractere de nova linha.Isso deve servir:
fonte
Para voltar ao início de um arquivo aberto e retornar a primeira linha, faça o seguinte:
fonte
fonte
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):
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
\n
caractere 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 ...fonte
.read()
deveria ser chamado primeiro.fonte