Baca hanya baris pertama file?


209

Bagaimana Anda mendapatkan hanya baris pertama file sebagai string dengan Python?


4
Jika Anda sudah membaca file ("Setelah membaca file"), Anda sudah membaca baris pertama! (Dengan asumsi setidaknya ada satu baris.)
William Pursell

3
Perhatikan bahwa pertanyaan seperti sekarang memiliki arti yang berbeda dari yang semula. Beberapa jawaban sekarang terlihat konyol karena memperhitungkan bagian "setelah membaca dalam file" (yang telah dihapus).
Peter Hansen

Jawaban:


354

Gunakan .readline()metode ( Python 2 docs , Python 3 docs ):

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

Beberapa catatan:

  1. Seperti dicatat dalam dokumen, kecuali itu adalah satu-satunya baris dalam file, string yang dikembalikan dari f.readline()akan berisi baris tambahan. Anda mungkin ingin menggunakan f.readline().strip()sebagai gantinya untuk menghapus baris baru.
  2. The withpernyataan secara otomatis menutup file lagi ketika blok berakhir.
  3. The withpernyataan hanya bekerja di Python 2.5 dan ke atas, dan di Python 2,5 Anda perlu menggunakanfrom __future__ import with_statement
  4. Dalam Python 3 Anda harus menentukan pengkodean file untuk file yang Anda buka. Baca lebih lajut...

3
Dalam Python 3 jika file tersebut ascii atau utf8 Anda tidak harus menentukan pengkodean file. Dan jika tidak, Anda harus menentukan pengkodean ke codecs.open di Python 2 pula.
Evpok

2
@Evpok "Dalam Python 3 jika file tersebut ascii atau utf8 Anda tidak harus menentukan pengkodean file" - jika hanya itu yang benar! Kenyataannya sedikit lebih berantakan; seperti yang dicatat dalam dokumen, pengkodean default yang digunakan tergantung pada platform (dan mungkin berbeda bahkan pada komputer yang sama tergantung pada bagaimana Anda meluncurkan Python - misalnya, saya telah melihat kode yang bekerja pada shell normal saya dengan mengasumsikan UTF-8 meledak kemudian ketika dijalankan melalui Apache dengan mod_wsgi).
Mark Amery


20
fline=open("myfile").readline().rstrip()

Saya datang ke sini mencari ini. Terutama karena rstrip()menghapus karakter baris baru.
Shashank Sawant

5
-1; ini tidak menutup file, dan mengembalikan hasil yang salah jika baris pertama berisi spasi tambahan selain karakter baris baru itu sendiri.
Mark Amery

@MarkAmery: Sebenarnya, karena pegangan file tidak ditugaskan ke variabel, itu adalah sampah yang dikumpulkan segera, yang menutup file. (Meskipun, tentu saja, solusi yang diterima menggunakan manajer konteks masih jauh lebih baik.)
acdr

@acdr Apa yang Anda katakan adalah benar untuk CPython tetapi tidak untuk implementasi Python lainnya - lihat misalnya dokumen pengumpulan sampah PyPy yang menyebutkan sebagai titik kepentingan tertentu bahwa "file ... tidak segera ditutup ketika keluar dari ruang lingkup" . Untuk alasan ini, biasanya diperdebatkan (misalnya di stackoverflow.com/a/7396043/1709587 ) yang mengandalkan perilaku yang Anda gambarkan adalah praktik yang buruk.
Mark Amery


9

Untuk kembali ke awal file yang terbuka dan kemudian mengembalikan baris pertama, lakukan ini:

my_file.seek(0)
first_line = my_file.readline()

1
Hanya untuk memahami lebih baik, itu akan menjadi "my_file.seek (0) line = my_file.readline ()"
Alberto Perez

7
first_line = next(open(filename))

1
Apakah ini juga menutup file?
Abalter

Akhirnya, ketika Python meninggalkan blok.
vy32

6

Banyak jawaban lain di sini, tetapi untuk menjawab persis pertanyaan yang Anda ajukan (sebelum @MarkAmery pergi dan mengedit pertanyaan asli dan mengubah artinya):

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

Dengan kata lain, jika Anda sudah membaca dalam file (seperti yang Anda katakan), dan memiliki blok besar data dalam memori, maka untuk mendapatkan baris pertama dari itu secara efisien, lakukan split () pada karakter baris baru, sekali hanya, dan ambil elemen pertama dari daftar yang dihasilkan.

Perhatikan bahwa ini tidak termasuk \nkarakter di akhir baris, tetapi saya berasumsi Anda tidak menginginkannya (dan file single-line bahkan mungkin tidak memilikinya). Juga perhatikan bahwa meskipun cukup pendek dan cepat, itu membuat salinan data, jadi untuk gumpalan memori yang sangat besar Anda mungkin tidak menganggapnya "efisien". Seperti biasa, itu tergantung ...


8
Jika ini file besar, f.read () akan mencoba memuat seluruh file ke dalam memori yang bukan ide yang bagus. Sebuah alternatif akan membaca satu karakter pada satu waktu sampai baris baru atau EOF ditemui
randomThought

Sebenarnya, semua jawaban lain adalah alternatif yang lebih baik dari itu. Biasanya membaca file dengan readline () dan teman-teman akan memuat seluruh blok sekaligus, mungkin 32K memberi atau menerima, dan mencari melalui itu untuk menemukan baris baru berikutnya. Jauh lebih cepat dan lebih efisien. Jawaban saya akan berguna hanya jika dia sudah memuat semuanya, dalam hal ini kita dapat menganggap dia baik-baik saja dengan semuanya dalam memori.
Peter Hansen

2
Saya tidak yakin bahwa saya mengubah artinya. Tidak ada artinya bertanya bagaimana "membaca" baris pertama dari sebuah file setelah "membaca" seluruh file. Dengan demikian, cukup jelas bagi saya bahwa niat si penanya bukan untuk menganggap bahwa .read()harus dipanggil terlebih dahulu.
Mark Amery

@MarkAmery, pertanyaannya adalah kata-kata yang buruk ("sangat tidak berarti") sehingga Anda menebak maksudnya ("jelas bagi saya") dan menulis ulang untuk mencocokkan. Penafsiran saya berbeda. Jelas sampai dan kecuali memperjelas harpalss, semua yang kita miliki adalah kata-kata asli ditambah penerimaannya dari jawaban (yaitu "mencari (0)") yang bagi saya jelas menunjukkan bahwa ia telah sudah membaca dalam file, setidaknya melewati garis pertama.
Peter Hansen

Anda harus menghapus jawaban ini. itu bukan cara yang benar dan bisa menipu orang.
thang

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

20
Ada beberapa jawaban di atas lima tahun yang mengandung pendekatan ini . Anda tidak melakukan apa pun selain membuat kebisingan dengan menambahkan yang lain.
Mark Amery
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.