Leggi solo la prima riga di un file?


209

Come otterresti solo la prima riga di un file come stringa con Python?


4
Se hai già letto il file ("Dopo aver letto un file"), hai già letto la prima riga! (Supponendo che ci sia almeno una riga.)
William Pursell il

3
Si noti che la domanda come ora formulata ha un significato diverso rispetto a prima. Alcune risposte ora sembrano sciocche in quanto hanno preso in considerazione la parte "dopo aver letto in un file" (che è stata rimossa).
Peter Hansen,

Risposte:


354

Usa il .readline()metodo ( documenti Python 2 , documenti Python 3 ):

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

Alcune note:

  1. Come indicato nei documenti, a meno che non sia l'unica riga nel file, la stringa restituita f.readline()conterrà una nuova riga finale. Potresti voler utilizzare f.readline().strip()invece per rimuovere la nuova riga.
  2. L' withistruzione chiude di nuovo automaticamente il file al termine del blocco.
  3. L' withistruzione funziona solo in Python 2.5 e versioni successive e in Python 2.5 è necessario utilizzarefrom __future__ import with_statement
  4. In Python 3 dovresti specificare la codifica del file per il file che apri. Leggi di più...

3
In Python 3 se il file è ascii o utf8 non è necessario specificare la codifica del file. E in caso contrario dovresti specificare comunque la codifica codecs.open in Python 2.
Evpok,

2
@Evpok "In Python 3 se il file è ASCII o UTF8 non è necessario specificare la codifica del file" - se solo fosse strettamente vero! La realtà è leggermente più disordinata; come notato nei documenti, la codifica predefinita utilizzata dipende dalla piattaforma (e può differire anche sullo stesso computer a seconda di come si avvia Python - per esempio, ho visto il codice che funzionava nella mia normale shell ipotizzando che UTF-8 esplodesse in seguito quando si esegue Apache con mod_wsgi).
Mark Amery,


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

Sono venuto qui per cercarlo. Soprattutto da quando rstrip()rimuove il carattere di nuova riga.
Shashank Sawant,

5
-1; questo non chiude il file e restituisce un risultato errato se la prima riga contiene spazi vuoti finali oltre al carattere di nuova riga stesso.
Mark Amery,

@MarkAmery: In realtà, poiché l'handle del file non è assegnato a una variabile, è subito la garbage collection, che chiude il file. (Sebbene, ovviamente, la soluzione accettata utilizzando un gestore di contesto sia ancora molto migliore.)
acdr

@acdr Quello che dici è vero per CPython ma non per altre implementazioni di Python - vedi ad esempio i documenti PyPy Garbage Collection che menzionano come un particolare punto di interesse che "i file ... non vengono prontamente chiusi quando escono dall'ambito" . Per questo motivo, in genere si sostiene (ad es. Su stackoverflow.com/a/7396043/1709587 ) che fare affidamento sul comportamento descritto è una cattiva pratica.
Mark Amery,


9

Per tornare all'inizio di un file aperto e quindi restituire la prima riga, procedere come segue:

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

1
Solo per capire meglio, sarebbe "my_file.seek (0) line = my_file.readline ()"
Alberto Perez,

7
first_line = next(open(filename))

1
Questo chiude anche il file?
abalter il

Alla fine, quando Python lascia il blocco.
vy32,

6

Molte altre risposte qui, ma per rispondere esattamente alla domanda che hai posto (prima che @MarkAmery andasse a modificare la domanda originale e ne cambiasse il significato):

>>> 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]

In altre parole, se hai già letto nel file (come hai detto) e hai un grosso blocco di dati in memoria, quindi per ottenere la prima riga da esso in modo efficiente, fai una divisione () sul carattere di nuova riga, una volta solo e prendi il primo elemento dall'elenco risultante.

Nota che questo non include il \ncarattere alla fine della riga, ma suppongo che tu non lo voglia comunque (e un file a riga singola potrebbe non averne nemmeno uno). Si noti inoltre che sebbene sia piuttosto breve e veloce, crea una copia dei dati, quindi per un blocco di memoria molto grande non si può considerare "efficiente". Come sempre, dipende ...


8
Se questo è un file di grandi dimensioni, f.read () proverà a caricare l'intero file in memoria, il che non sarebbe una buona idea. Un'alternativa sarebbe quella di leggere un personaggio alla volta fino a quando non si incontra una nuova riga o EOF
randomThought

In realtà, tutte le altre risposte sono alternative migliori di così. Normalmente la lettura di un file con readline () e gli amici caricavano interi blocchi alla volta, forse 32K danno o prendevano, e cercavano quello per trovare la nuova riga. Molto più veloce ed efficiente. La mia risposta sarebbe utile solo se sta già caricando l'intera cosa, nel qual caso possiamo supporre che stia bene con tutto in memoria.
Peter Hansen,

2
Non sono convinto di aver cambiato il significato. È piuttosto insignificante chiedere come "leggere" la prima riga da un file dopo aver "letto" l'intero file. In quanto tale, è abbastanza ovvio per me che l'intenzione del richiedente non era presumere che .read()debba essere chiamato per primo.
Mark Amery,

@MarkAmery, la domanda era scarsamente formulata ("piuttosto insignificante"), quindi hai indovinato l'intento ("ovvio per me") e l'hai riformulato in modo che corrispondesse. La mia interpretazione differisce. Chiaramente fino a quando e a meno che Harpalss non chiarisca, tutto ciò che abbiamo sono la formulazione originale più la sua accettazione di una risposta (cioè "seek (0)") che per me mostra chiaramente che aveva già letto nel file, almeno oltre la prima riga.
Peter Hansen,

dovresti rimuovere questa risposta. non è il modo giusto e può ingannare le persone.
Grazie,

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

20
Ci sono risposte multiple su cinque anni che contengono esattamente questo approccio . Non stai facendo altro che creare rumore aggiungendone un altro.
Mark Amery,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.