Untuk latihan yang saya lakukan, saya mencoba membaca konten file dua kali menggunakan read()
metode ini. Anehnya, ketika saya menyebutnya untuk kedua kalinya, sepertinya tidak mengembalikan konten file sebagai string?
Ini kodenya
f = f.open()
# get the year
match = re.search(r'Popularity in (\d+)', f.read())
if match:
print match.group(1)
# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', f.read())
if matches:
# matches is always None
Tentu saja saya tahu bahwa ini bukan cara yang paling efisien atau terbaik, bukan itu intinya di sini. Intinya adalah, mengapa saya tidak bisa menelepon read()
dua kali? Apakah saya harus mengatur ulang pegangan file? Atau tutup / buka kembali file untuk melakukan itu?
Jawaban:
Panggilan
read()
membaca seluruh file dan meninggalkan kursor baca di akhir file (tidak ada lagi yang bisa dibaca). Jika Anda ingin membaca sejumlah baris sekaligus, Anda dapat menggunakanreadline()
,readlines()
atau mengulang baris denganfor line in handle:
.Untuk menjawab pertanyaan Anda secara langsung, setelah file dibaca, dengan
read()
Anda dapat menggunakanseek(0)
untuk mengembalikan kursor baca ke awal file (dokumen ada di sini ). Jika Anda tahu bahwa file tidak akan terlalu besar, Anda juga dapat menyimpanread()
hasilnya ke variabel, menggunakannya dalam ekspresi findall Anda.Ps. Jangan lupa untuk menutup file setelah Anda selesai;)
sumber
with
.ya, seperti di atas ...
saya akan menulis hanya sebuah contoh:
sumber
Setiap orang yang telah menjawab pertanyaan ini sejauh ini benar -
read()
menelusuri file, jadi setelah Anda memanggilnya, Anda tidak dapat memanggilnya lagi.Apa yang akan saya tambahkan adalah bahwa dalam kasus khusus Anda, Anda tidak perlu mencari kembali ke awal atau membuka kembali file, Anda cukup menyimpan teks yang telah Anda baca dalam variabel lokal, dan menggunakannya dua kali, atau sebanyak yang Anda suka, dalam program Anda:
sumber
from pathlib import Path; text = Path(filename).read_text()
Menjaga pembukaan, penutupan, dll.Penunjuk baca berpindah ke setelah byte / karakter baca terakhir. Gunakan
seek()
metode untuk memundurkan penunjuk baca ke awal.sumber
Setiap file terbuka memiliki posisi terkait.
Ketika Anda membaca () Anda membaca dari posisi itu. Misalnya
read(10)
membaca 10 byte pertama dari file yang baru dibuka, kemudian yang lainread(10)
membaca 10 byte berikutnya.read()
tanpa argumen membaca semua konten file, meninggalkan posisi file di akhir file. Lain kali Anda menelepon,read()
tidak ada yang bisa dibaca.Anda dapat menggunakan
seek
untuk memindahkan posisi file. Atau mungkin lebih baik dalam kasus Anda adalah melakukan saturead()
dan menyimpan hasilnya untuk kedua pencarian.sumber
read()
mengkonsumsi . Jadi, Anda dapat mengatur ulang file, atau mencoba memulai sebelum membaca ulang. Atau, jika itu menggabungkan tugas Anda, Anda dapat menggunakanread(n)
untuk hanya menggunakann
byte.sumber
Saya selalu menemukan metode membaca sesuatu seperti berjalan menyusuri gang gelap. Anda turun sedikit dan berhenti tetapi jika Anda tidak menghitung langkah Anda, Anda tidak yakin seberapa jauh Anda melangkah. Seek memberikan solusi dengan memposisikan ulang, opsi lainnya adalah Tell yang mengembalikan posisi di sepanjang file. Mungkin api file Python dapat menggabungkan read dan seek menjadi read_from (position, bytes) untuk membuatnya lebih sederhana - sampai itu terjadi Anda harus membaca halaman ini .
sumber