Czyta tylko pierwszą linię pliku?

208

Jak uzyskasz tylko pierwszy wiersz pliku jako ciąg znaków w Pythonie?

harpalss
źródło
4
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).
Peter Hansen

Odpowiedzi:

354

Użyj .readline()metody ( dokumenty w języku Python 2, dokumenty w języku Python 3 ):

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

Niektóre uwagi:

  1. 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.
  2. withOświadczenie automatycznie zamyka plik ponownie, gdy końce bloku.
  3. withOświadczenie działa tylko w Pythonie 2.5 iw górę, iw Pythonie 2.5 trzeba użyćfrom __future__ import with_statement
  4. W Pythonie 3 powinieneś określić kodowanie pliku dla otwieranego pliku. Czytaj więcej...
Tor Valamo
źródło
3
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).
Mark Amery
21
infile = open('filename.txt', 'r')
firstLine = infile.readline()
Jaelebi
źródło
17
Nie zamykasz pliku. Rozwiązanie zwith jest lepszy.
becko
20
fline=open("myfile").readline().rstrip()
ghostdog74
źródło
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ą.
Mark Amery
9

To powinno to zrobić:

f = open('myfile.txt')
first = f.readline()
Jarret Hardie
źródło
9

Aby wrócić do początku otwartego pliku, a następnie zwrócić pierwszy wiersz, wykonaj następujące czynności:

my_file.seek(0)
first_line = my_file.readline()
dan-gph
źródło
1
Dla lepszego zrozumienia będzie to „my_file.seek (0) line = my_file.readline ()”
Alberto Perez,
7
first_line = next(open(filename))
hoju
źródło
1
Czy to również powoduje zamknięcie pliku?
abalter
Ostatecznie, kiedy Python opuszcza blok.
vy32
6

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

Peter Hansen
źródło
8
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.
thang
-15
f1 = open("input1.txt", "r")
print(f1.readline())
Zwon
źródło
20
Istnieje wiele odpowiedzi powyżej pięciu lat, zawierających dokładnie to podejście . Robisz tylko szum, dodając kolejny.
Mark Amery