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.
with open('myfile.txt')as f:
first_line = f.readline()
Einige Notizen:
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.
Die withAnweisung schließt die Datei automatisch wieder, wenn der Block endet.
Die withAnweisung funktioniert nur in Python 2.5 und höher, und in Python 2.5 müssen Sie verwendenfrom __future__ import with_statement
In Python 3 sollten Sie die Dateicodierung für die von Ihnen geöffnete Datei angeben. Weiterlesen...
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).
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.
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 ...
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.
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.
Antworten:
Verwenden Sie die
.readline()
Methode ( Python 2-Dokumente , Python 3-Dokumente ):Einige Notizen:
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 Sief.readline().strip()
stattdessen die neue Zeile entfernen.with
Anweisung schließt die Datei automatisch wieder, wenn der Block endet.with
Anweisung funktioniert nur in Python 2.5 und höher, und in Python 2.5 müssen Sie verwendenfrom __future__ import with_statement
quelle
mod_wsgi
).quelle
with
ist besser.quelle
rstrip()
das Zeilenumbruchzeichen entfernt wird.Dies sollte es tun:
quelle
Gehen Sie folgendermaßen vor, um zum Anfang einer geöffneten Datei zurückzukehren und dann die erste Zeile zurückzugeben:
quelle
quelle
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):
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
\n
Zeichen 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 ...quelle
.read()
dies zuerst aufgerufen werden muss.quelle