Nur die erste Zeile einer Datei lesen?

208

Wie würden Sie mit Python nur die erste Zeile einer Datei als Zeichenfolge erhalten?

harpalss
quelle
4
Wenn Sie die Datei bereits gelesen haben ("Nach dem Einlesen einer Datei"), haben Sie bereits die erste Zeile gelesen! (Vorausgesetzt, es gibt mindestens eine Zeile.)
William Pursell
3
Beachten Sie, dass die jetzt formulierte Frage eine andere Bedeutung hat als ursprünglich. Einige Antworten sehen jetzt albern aus, da sie den Teil "Nach dem Einlesen einer Datei" (der entfernt wurde) berücksichtigt haben.
Peter Hansen

Antworten:

353

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

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

Einige Notizen:

  1. Wie in den Dokumenten angegeben, f.readline()enthält die zurückgegebene Zeichenfolge, sofern dies nicht die einzige Zeile in der Datei ist, eine nachfolgende neue Zeile. Möglicherweise möchten Sie f.readline().strip()stattdessen die neue Zeile entfernen.
  2. Die withAnweisung schließt die Datei automatisch wieder, wenn der Block endet.
  3. Die withAnweisung funktioniert nur in Python 2.5 und höher, und in Python 2.5 müssen Sie verwendenfrom __future__ import with_statement
  4. In Python 3 sollten Sie die Dateicodierung für die von Ihnen geöffnete Datei angeben. Weiterlesen...
Tor Valamo
quelle
3
Wenn die Datei in Python 3 ASCII oder UtF8 ist, müssen Sie die Dateicodierung nicht angeben. Wenn dies nicht der Fall ist, sollten Sie die Codierung für codecs.open in Python 2 trotzdem angeben.
Evpok
2
@Evpok "Wenn die Datei in Python 3 ascii oder utf8 ist, müssen Sie die Dateicodierung nicht angeben" - wenn das nur streng wahr wäre! Die Realität ist etwas chaotischer; Wie in den Dokumenten angegeben, ist die verwendete Standardcodierung plattformabhängig (und kann je nach Start von Python sogar auf demselben Computer unterschiedlich sein. Beispielsweise habe ich Code gesehen, der in meiner normalen Shell funktioniert hat, indem angenommen wurde, dass UTF-8 später explodiert beim Durchlaufen von Apache mit mod_wsgi).
Mark Amery
21
infile = open('filename.txt', 'r')
firstLine = infile.readline()
Jaelebi
quelle
17
Sie schließen die Datei nicht. Die Lösung mitwith ist besser.
Becko
20
fline=open("myfile").readline().rstrip()
Ghostdog74
quelle
Ich bin hierher gekommen, um das zu suchen. Zumal rstrip()das Zeilenumbruchzeichen entfernt wird.
Shashank Sawant
5
-1; Dadurch wird die Datei nicht geschlossen und es wird ein falsches Ergebnis zurückgegeben, wenn die erste Zeile neben dem Zeilenumbruchzeichen ein nachfolgendes Leerzeichen enthält.
Mark Amery
@MarkAmery: Da das Dateihandle keiner Variablen zugewiesen ist, wird der Müll sofort gesammelt, wodurch die Datei geschlossen wird. (Obwohl die akzeptierte Lösung mit einem Kontextmanager natürlich immer noch viel besser ist.)
acdr
@acdr Was Sie sagen, gilt für CPython, aber nicht für andere Python-Implementierungen - siehe z. B. die PyPy-Garbage-Collection-Dokumente, in denen als besonderer Punkt von Interesse erwähnt wird, dass "Dateien ... nicht sofort geschlossen werden, wenn sie den Gültigkeitsbereich verlassen" . Aus diesem Grund wird normalerweise argumentiert (z. B. unter stackoverflow.com/a/7396043/1709587 ), dass es eine schlechte Praxis ist, sich auf das von Ihnen beschriebene Verhalten zu verlassen.
Mark Amery
9

Dies sollte es tun:

f = open('myfile.txt')
first = f.readline()
Jarret Hardie
quelle
9

Gehen Sie folgendermaßen vor, um zum Anfang einer geöffneten Datei zurückzukehren und dann die erste Zeile zurückzugeben:

my_file.seek(0)
first_line = my_file.readline()
dan-gph
quelle
1
Nur zum besseren Verständnis wäre es "my_file.seek (0) line = my_file.readline ()"
Alberto Perez
7
first_line = next(open(filename))
hoju
quelle
1
Schließt dies auch die Datei?
Abalter
Schließlich, wenn Python den Block verlässt.
vy32
6

Viele andere Antworten hier, aber um genau die Frage zu beantworten , die Sie gestellt haben (bevor @MarkAmery die ursprüngliche Frage bearbeitet und die Bedeutung geändert hat):

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

Mit anderen Worten, wenn Sie die Datei bereits eingelesen haben (wie Sie sagten) und einen großen Datenblock im Speicher haben, führen Sie einmal einen split () für das Zeilenumbruchzeichen aus, um die erste Zeile effizient daraus zu erhalten nur und nehmen Sie das erste Element aus der resultierenden Liste.

Beachten Sie, dass das \nZeichen am Ende der Zeile nicht enthalten ist, aber ich gehe davon aus, dass Sie es sowieso nicht möchten (und eine einzeilige Datei möglicherweise nicht einmal eines hat). Beachten Sie auch, dass es zwar ziemlich kurz und schnell ist, aber eine Kopie der Daten erstellt, sodass Sie es für einen wirklich großen Speicherblock möglicherweise nicht als "effizient" betrachten. Wie immer kommt es darauf an ...

Peter Hansen
quelle
8
Wenn es sich um eine große Datei handelt, versucht f.read (), die gesamte Datei in den Speicher zu laden, was keine gute Idee wäre. Eine Alternative wäre, jeweils ein Zeichen zu lesen, bis eine neue Zeile oder EOF gefunden wird
randomThought
Eigentlich sind alle anderen Antworten bessere Alternativen. Normalerweise lädt das Lesen einer Datei mit readline () und Freunden ganze Blöcke gleichzeitig, vielleicht 32K Geben oder Nehmen, und durchsucht diese, um die nächste neue Zeile zu finden. Viel schneller und effizienter. Meine Antwort wäre nur dann nützlich, wenn er bereits das gesamte Ding geladen hat. In diesem Fall können wir davon ausgehen, dass er damit einverstanden ist, alles im Speicher zu haben.
Peter Hansen
2
Ich bin nicht davon überzeugt, dass ich die Bedeutung geändert habe. Es ist ziemlich bedeutungslos zu fragen, wie die erste Zeile aus einer Datei "gelesen" werden soll, nachdem die gesamte Datei "gelesen" wurde. Daher ist es für mich ziemlich offensichtlich, dass der Fragesteller nicht davon ausgehen wollte, dass .read()dies zuerst aufgerufen werden muss.
Mark Amery
@ MarkAmery, die Frage war schlecht formuliert ("ziemlich bedeutungslos"), also haben Sie die Absicht erraten ("offensichtlich für mich") und sie entsprechend umformuliert. Meine Interpretation ist unterschiedlich. Klar , solange nicht harpalss stellt klar, alles , was wir haben , ist die ursprüngliche Formulierung und seine Annahme einer Antwort (dh „sucht (0)“) , die ich zeigt deutlich , dass er hatte bereits in der Datei gelesen, zumindest nach der ersten Zeile.
Peter Hansen
Sie sollten diese Antwort entfernen. Es ist nicht der richtige Weg und kann Menschen austricksen.
Thang
-15
f1 = open("input1.txt", "r")
print(f1.readline())
Zwon
quelle
19
Es gibt mehrere Antworten, die älter als fünf Jahre sind und genau diesen Ansatz enthalten . Sie tun nichts anderes, als Lärm zu erzeugen, indem Sie einen weiteren hinzufügen.
Mark Amery