Jeśli już przeczytałeś plik („Po przeczytaniu w pliku”), już przeczytałeś pierwszy wiersz! (Zakładając, że jest co najmniej jedna linia.)
William Pursell
3
Zwróć uwagę, że sformułowane pytanie ma inne znaczenie niż pierwotnie. Niektóre odpowiedzi wyglądają teraz głupio, biorąc pod uwagę część „po wczytaniu pliku” (która została usunięta).
with open('myfile.txt')as f:
first_line = f.readline()
Niektóre uwagi:
Jak zauważono w dokumentach, jeśli nie jest to jedyna linia w pliku, ciąg znaków zwrócony z f.readline()będzie zawierać końcowy znak nowej linii. Zamiast tego możesz użyć f.readline().strip()do usunięcia nowej linii.
withOświadczenie automatycznie zamyka plik ponownie, gdy końce bloku.
withOświadczenie działa tylko w Pythonie 2.5 iw górę, iw Pythonie 2.5 trzeba użyćfrom __future__ import with_statement
W Pythonie 3 powinieneś określić kodowanie pliku dla otwieranego pliku. Czytaj więcej...
W Pythonie 3, jeśli plik jest ascii lub utf8, nie musisz określać kodowania pliku. A jeśli nie jest, powinieneś określić kodowanie do codecs.open w Pythonie 2.
Evpok
2
@Evpok „W Pythonie 3, jeśli plik to ascii lub utf8, nie musisz określać kodowania pliku” - jeśli tylko byłyby ściśle prawdziwe! Rzeczywistość jest nieco bardziej niechlujna; jak zauważono w dokumentacji, domyślne kodowanie jest zależne od platformy (i może różnić się nawet na tym samym komputerze, w zależności od sposobu uruchomienia Pythona - na przykład widziałem kod, który działał w mojej normalnej powłoce, zakładając, że UTF-8 później wybuchnie po uruchomieniu przez Apache przy pomocy mod_wsgi).
Przybyłem tutaj, szukając tego. Zwłaszcza, że rstrip()usuwa znak nowej linii.
Shashank Sawant
5
-1; to nie zamyka pliku i zwraca niepoprawny wynik, jeśli pierwszy wiersz zawiera spacje końcowe oprócz samego znaku nowej linii.
Mark Amery
@MarkAmery: W rzeczywistości, ponieważ uchwyt pliku nie jest przypisany do zmiennej, jest natychmiast usuwany, co powoduje zamknięcie pliku. (Chociaż oczywiście zaakceptowane rozwiązanie wykorzystujące menedżera kontekstu jest nadal znacznie lepsze.)
acdr
@acdr To, co mówisz, jest prawdą w przypadku CPython, ale nie w przypadku innych implementacji Pythona - patrz np. dokumenty śmieciowego PyPy, które wspominają jako szczególny punkt zainteresowania, że „pliki ... nie są natychmiast zamykane, gdy wykraczają poza zakres” . Z tego powodu zwykle argumentuje się (np. Na stackoverflow.com/a/7396043/1709587 ), że poleganie na opisanym przez ciebie zachowaniu jest złą praktyką.
Wiele innych odpowiedzi tutaj, ale aby dokładnie odpowiedzieć na zadane pytanie (zanim @MarkAmery poszedł i zredagował oryginalne pytanie i zmienił znaczenie):
>>> 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]
Innymi słowy, jeśli już czytałeś plik (jak powiedziałeś) i masz duży blok danych w pamięci, a następnie, aby efektywnie uzyskać pierwszy wiersz, wykonaj split () na znaku nowej linii, raz tylko i weź pierwszy element z wynikowej listy.
Zauważ, że nie obejmuje to \nznaku na końcu linii, ale zakładam, że i tak go nie chcesz (a plik jednowierszowy może nawet go nie mieć). Zauważ też, że chociaż jest dość krótki i szybki, robi kopię danych, więc w przypadku naprawdę dużej kropli pamięci możesz nie uznać go za „wydajny”. Jak zawsze zależy ...
Jeśli jest to duży plik, f.read () spróbuje załadować cały plik do pamięci, co nie byłoby dobrym pomysłem. Alternatywą byłoby czytanie jednego znaku na raz, aż pojawi się nowa linia lub EOF
randomThought
Właściwie wszystkie inne odpowiedzi są lepszymi alternatywami niż to. Zwykle czytanie pliku za pomocą readline () i znajomych ładowałoby całe bloki na raz, może 32K dawało lub brało i przeszukiwało to, aby znaleźć następny nowy wiersz. Znacznie szybszy i bardziej wydajny. Moja odpowiedź byłaby przydatna tylko wtedy, gdy już ładuje całą rzecz, w takim przypadku możemy założyć, że nic mu nie jest w pamięci.
Peter Hansen,
2
Nie jestem przekonany, że zmieniłem znaczenie. Nie ma sensu pytać, jak „odczytać” pierwszą linię z pliku po „odczytaniu” całego pliku. Jako takie, jest dla mnie dość oczywiste, że intencją pytającego było nie zakładać, że .read()należy to najpierw wywołać.
Mark Amery
@ MarkAmery, pytanie było źle sformułowane („całkiem bez znaczenia”), więc zgadłeś, co to było („dla mnie oczywiste”) i przeredagowałeś je, aby pasowało. Moja interpretacja jest inna. Wyraźnie do czasu, gdy harpalss wyjaśnia, wszystkie mamy są oryginalne brzmienie oraz jego akceptacja odpowiedzi (czyli „seek (0)”), które do mnie wyraźnie pokazuje, że on miał już przeczytać w pliku, przynajmniej po pierwszym wierszu.
Peter Hansen
powinieneś usunąć tę odpowiedź. to nie jest właściwa droga i może oszukiwać ludzi.
Odpowiedzi:
Użyj
.readline()
metody ( dokumenty w języku Python 2, dokumenty w języku Python 3 ):Niektóre uwagi:
f.readline()
będzie zawierać końcowy znak nowej linii. Zamiast tego możesz użyćf.readline().strip()
do usunięcia nowej linii.with
Oświadczenie automatycznie zamyka plik ponownie, gdy końce bloku.with
Oświadczenie działa tylko w Pythonie 2.5 iw górę, iw Pythonie 2.5 trzeba użyćfrom __future__ import with_statement
źródło
mod_wsgi
).źródło
with
jest lepszy.źródło
rstrip()
usuwa znak nowej linii.To powinno to zrobić:
źródło
Aby wrócić do początku otwartego pliku, a następnie zwrócić pierwszy wiersz, wykonaj następujące czynności:
źródło
źródło
Wiele innych odpowiedzi tutaj, ale aby dokładnie odpowiedzieć na zadane pytanie (zanim @MarkAmery poszedł i zredagował oryginalne pytanie i zmienił znaczenie):
Innymi słowy, jeśli już czytałeś plik (jak powiedziałeś) i masz duży blok danych w pamięci, a następnie, aby efektywnie uzyskać pierwszy wiersz, wykonaj split () na znaku nowej linii, raz tylko i weź pierwszy element z wynikowej listy.
Zauważ, że nie obejmuje to
\n
znaku na końcu linii, ale zakładam, że i tak go nie chcesz (a plik jednowierszowy może nawet go nie mieć). Zauważ też, że chociaż jest dość krótki i szybki, robi kopię danych, więc w przypadku naprawdę dużej kropli pamięci możesz nie uznać go za „wydajny”. Jak zawsze zależy ...źródło
.read()
należy to najpierw wywołać.źródło