Saya perlu membaca file besar, baris demi baris. Katakanlah file tersebut memiliki lebih dari 5GB dan saya perlu membaca setiap baris, tetapi jelas saya tidak ingin menggunakannya readlines()
karena akan membuat daftar yang sangat besar dalam memori.
Bagaimana kode di bawah ini berfungsi untuk kasus ini? Apakah dengan xreadlines
sendirinya membaca satu per satu ke dalam memori? Apakah ekspresi generator diperlukan?
f = (line for line in open("log.txt").xreadlines()) # how much is loaded in memory?
f.next()
Plus, apa yang bisa saya lakukan untuk membaca ini dalam urutan terbalik, seperti tail
perintah Linux ?
Saya menemukan:
http://code.google.com/p/pytailer/
dan
" kepala python, ekor dan terbelakang dibaca oleh baris file teks "
Keduanya bekerja dengan sangat baik!
Jawaban:
Saya memberikan jawaban ini karena Keith's, meskipun ringkas, tidak menutup file secara eksplisit
sumber
for
loop yang berulang di atas garis, Anda dapat menggunakanchunk = infile.read(chunksize)
untuk membaca potongan ukuran terbatas terlepas dari kontennya. Anda harus mencari sendiri baris baru di dalam chunks.Yang perlu Anda lakukan adalah menggunakan objek file sebagai iterator.
Lebih baik lagi menggunakan manajer konteks dalam versi Python terbaru.
Ini juga akan secara otomatis menutup file.
sumber
Pendekatan sekolah lama:
sumber
Anda lebih baik menggunakan iterator saja. Relevan: http://docs.python.org/library/fileinput.html
Dari dokumen:
Ini akan menghindari menyalin seluruh file ke memori sekaligus.
sumber
close()
metodeFileInput
objek kelas yang dikembalikan ketika loop selesai - jadi saya akan menghindari menggunakannya dengan cara ini. Dalam Python 3.2 mereka akhirnya telah membuatfileinput
kompatibel dengan protokol manajer konteks yang membahas masalah ini (tetapi kode masih tidak akan ditulis seperti yang ditunjukkan).Inilah yang Anda lakukan jika Anda tidak memiliki baris baru dalam file:
sumber
Silakan coba ini:
sumber
Aku tidak percaya itu bisa semudah jawaban @ john-la-rooy membuatnya tampak. Jadi, saya membuat ulang
cp
perintah menggunakan baris demi baris membaca dan menulis. CEPAT GILA.sumber
readline
ujung jalur standar python , ini memiliki efek samping mengubah dokumen dengan ujung jalur DOS\r\n
ke ujung garis Unix\n
. Seluruh alasan saya untuk mencari topik ini adalah bahwa saya perlu mengonversi file log yang menerima tumpukan akhiran garis (karena pengembang secara membabi buta menggunakan berbagai pustaka .NET). Saya terkejut menemukan bahwa setelah tes kecepatan awal saya, saya tidak perlu kembali danrstrip
garis. Itu sudah sempurna!Proyek kebakaran telah berlangsung jauh selama 6 tahun terakhir. Ini memiliki API sederhana yang mencakup subset fitur panda yang berguna.
dask.dataframe menangani chunking secara internal, mendukung banyak operasi yang paralel dan memungkinkan Anda untuk mengekspor irisan kembali ke panda dengan mudah untuk operasi dalam memori.
sumber
Inilah kode untuk memuat file teks dari berbagai ukuran tanpa menyebabkan masalah memori. Ini mendukung file berukuran gigabytes
https://gist.github.com/iyvinjose/e6c1cb2821abd5f01fd1b9065cbc759d
unduh file data_loading_utils.py dan impor ke dalam kode Anda
pemakaian
Metode process_lines adalah fungsi callback. Itu akan dipanggil untuk semua baris, dengan data parameter mewakili satu baris file pada satu waktu.
Anda dapat mengonfigurasi variabel CHUNK_SIZE tergantung pada konfigurasi perangkat keras mesin Anda.
sumber
Bagaimana dengan ini? Bagilah file Anda menjadi potongan-potongan dan kemudian membacanya baris demi baris, karena ketika Anda membaca file, sistem operasi Anda akan men-cache baris berikutnya. Jika Anda membaca file baris demi baris, Anda tidak menggunakan informasi yang di-cache secara efisien.
Alih-alih, bagi file menjadi potongan-potongan dan muat seluruh potongan ke dalam memori dan kemudian lakukan pemrosesan Anda.
sumber
Terima kasih! Saya baru-baru ini dikonversi ke python 3 dan telah frustrasi dengan menggunakan readlines (0) untuk membaca file besar. Ini memecahkan masalah. Tetapi untuk mendapatkan setiap baris, saya harus melakukan beberapa langkah ekstra. Setiap baris didahului oleh "b '" yang saya kira itu dalam format biner. Menggunakan "decode (utf-8)" mengubahnya ascii.
Lalu saya harus menghapus "= \ n" di tengah setiap baris.
Lalu saya membagi garis di baris baru.
Berikut adalah kode yang dimulai tepat di atas "data cetak" dalam kode Arohi.
sumber
Saya mendemonstrasikan pendekatan akses acak level byte paralel di sini dalam pertanyaan lain ini:
Mendapatkan jumlah baris dalam file teks tanpa garis baca
Beberapa jawaban yang sudah disediakan bagus dan ringkas. Saya suka beberapa dari mereka. Tapi itu sangat tergantung apa yang ingin Anda lakukan dengan data yang ada di file. Dalam kasus saya, saya hanya ingin menghitung baris, secepat mungkin pada file teks besar. Kode saya dapat dimodifikasi untuk melakukan hal-hal lain juga, seperti kode apa pun.
sumber
Solusi terbaik yang saya temukan mengenai ini, dan saya mencobanya pada file 330 MB.
Di mana line_length adalah jumlah karakter dalam satu baris. Misalnya "abcd" memiliki panjang garis 4.
Saya telah menambahkan 2 dalam panjang garis untuk melewati karakter '\ n' dan pindah ke karakter berikutnya.
sumber
Ini mungkin berguna ketika Anda ingin bekerja secara paralel dan hanya membaca potongan data tetapi tetap bersih dengan baris baru.
sumber
semoga ini membantu.
sumber