2009-12-15 21 views
122

Wie würden Sie nur die erste Zeile einer Datei als String mit Python bekommen?Nur die erste Zeile einer Datei lesen?

+2

Wenn Sie die Datei bereits gelesen haben ("Nach dem Lesen in einer Datei "), hast du schon die erste Zeile gelesen! (Angenommen, es gibt mindestens eine Zeile.) –

+1

Beachten Sie, dass die Frage * wie jetzt formuliert * eine andere Bedeutung hat als ursprünglich. Einige Antworten sehen jetzt albern aus, da sie den Teil "nach dem Lesen in einer Datei" berücksichtigen (der entfernt wurde). –

Antwort

6

Dies sollte es tun:

f = open('myfile.txt') 
first = f.readline() 
16
infile = open('filename.txt', 'r') 
firstLine = infile.readline() 
+8

Sie schließen die Datei nicht. Die [Lösung mit 'with'] (http://stackoverflow.com/a/1904455/855050) ist besser. – becko

210

Verwenden Sie die .readline() Methode (Python 2 docs, Python 3 docs):

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

Einige Anmerkungen:

  1. Wie in der Dokumentation festgestellt , außer es ist das einzige Zeile in der Datei enthält die von f.readline() zurückgegebene Zeichenfolge einen abschließenden Zeilenumbruch. Möglicherweise möchten Sie stattdessen f.readline().strip() verwenden, um den Zeilenumbruch zu entfernen.
  2. Die Anweisung with schließt die Datei beim Beenden des Blocks automatisch erneut.
  3. Die with Anweisung funktioniert nur in Python 2.5 und höher, und in Python 2.5 Sie benötigen 3 from __future__ import with_statement
  4. In Python verwenden, sollten Sie die Datei-Kodierung für die Datei angeben Sie öffnen. Read more...
+3

In Python 3, wenn die Datei ascii oder utf8 ist, müssen Sie die Dateicodierung nicht angeben. Und wenn das nicht der Fall ist, sollten Sie die Kodierung in codecs.open sowieso in Python 2 angeben. – Evpok

+0

@Evpok * "In Python 3, wenn die Datei ascii oder utf8 ist, müssen Sie nicht die Dateikodierung angeben" * - wenn das nur strikt stimmt!Die Realität ist etwas unordentlicher; Wie in den Dokumenten erwähnt, ist die verwendete Standardcodierung plattformabhängig (und kann sich je nach dem, wie Sie Python starten, sogar auf demselben Computer unterscheiden. Ich habe beispielsweise Code gesehen, der bei meiner normalen Shell funktionierte, indem ich annahm, dass UTF-8 später explodierte wenn man Apache mit 'mod_wsgi' durchläuft. –

10
fline=open("myfile").readline().rstrip() 
+0

Ich kam hierher, um das zu suchen. Zumal 'rstrip()' das Newline-Zeichen entfernt. –

+3

-1; Dies schließt die Datei nicht und gibt ein falsches Ergebnis zurück, wenn die erste Zeile neben dem Zeilenumbruchzeichen selbst noch einen abschließenden Leerraum enthält. –

+0

@MarkAmery: Da das Datei-Handle keiner Variablen zugewiesen ist, wird sofort Müll gesammelt, wodurch die Datei geschlossen wird. (Obwohl die akzeptierte Lösung, die einen Kontextmanager verwendet, natürlich noch viel besser ist.) – acdr

8

Viele andere Antworten hier, aber genau die Frage, würden wir Sie bitten zu beantworten (vor @MarkAmery ging und bearbeitet die ursprüngliche Frage und verändert die Bedeutung):

>>> 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 Mit anderen Worten, wenn Sie die Datei bereits gelesen haben (wie Sie sagten) und einen großen Datenblock im Speicher haben, dann machen Sie einen Split() auf dem Zeilenumbruchzeichen, nur einmal, um die erste Zeile effizient zu erhalten , und nimm das erste Element aus der resultierenden Liste.

Beachten Sie, dass dies nicht das Zeichen \n am Ende der Zeile enthält, aber ich nehme an, Sie wollen es sowieso nicht (und eine einzeilige Datei möglicherweise nicht einmal). Beachten Sie auch, dass es, obwohl es ziemlich kurz und schnell ist, eine Kopie der Daten erstellt, so dass Sie es für einen wirklich großen Speicherblock nicht als "effizient" betrachten. Wie immer hängt es ...

+7

Wenn dies eine große Datei ist, wird f.read() versuchen, die gesamte Datei in den Speicher zu laden, was keine gute Idee wäre. Eine Alternative wäre, ein Zeichen nach dem anderen zu lesen, bis ein Newline oder EOF auftritt. – randomThought

+0

Eigentlich sind alle anderen Antworten bessere Alternativen. Normalerweise würde das Lesen einer Datei mit readline() und Freunden ganze Blöcke auf einmal laden, vielleicht 32K geben oder nehmen, und durchsuchen, um den nächsten Zeilenumbruch zu finden. Viel schneller und effizienter. Meine Antwort wäre nur dann nützlich, wenn er das gesamte Ding * bereits * geladen hat. In diesem Fall können wir annehmen, dass es okay ist, alles in Erinnerung zu haben. –

+2

Ich bin nicht davon überzeugt, dass ich die Bedeutung geändert habe. Es ist ziemlich sinnlos zu fragen, wie man die erste Zeile einer Datei "liest", nachdem man die ganze Datei "gelesen" hat. Als solches ist es für mich ziemlich offensichtlich, dass die Absicht des Fragestellers war, nicht anzunehmen, dass ".read()" zuerst aufgerufen werden muss. –

6

Um zum Anfang einer geöffneten Datei zurück, dies zu tun:

my_file.seek(0) 
+1

Nur zum besseren Verständnis wäre es "my_file.seek (0) line = my_file.readline()" –

6
first_line = next(open(filename)) 
+1

Schließt das auch die Datei? – abalter

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

Es gibt mehrere Antworten über fünf Jahre alt, die * genau diesen Ansatz * enthalten. Sie tun nichts anderes als Lärm zu erzeugen, indem Sie einen anderen hinzufügen. –

Verwandte Themen