Apa saja cara umum untuk membaca file di Ruby?
Sebagai contoh, berikut adalah satu metode:
fileObj = File.new($fileName, "r")
while (line = fileObj.gets)
puts(line)
end
fileObj.close
Saya tahu Ruby sangat fleksibel. Apa manfaat / kelemahan dari setiap pendekatan?
Jawaban:
Dimungkinkan juga untuk secara eksplisit menutup file setelah seperti di atas (lulus blok untuk
open
menutupnya untuk Anda):sumber
foreach
alih-alihopen
dan buangeach_line
blokir.f.each { |line| ... }
danf.each_line { |line| ... }
tampaknya memiliki perilaku yang sama (setidaknya di Ruby 2.0.0).Cara termudah jika file tidak terlalu panjang adalah:
Memang,
IO.read
atauFile.read
secara otomatis menutup file, sehingga tidak perlu menggunakanFile.open
blok.sumber
IO.read
atauFile.read
juga secara otomatis menutup file, meskipun kata-kata Anda membuatnya terdengar seperti tidak.Berhati-hatilah dengan file "slurping". Saat itulah Anda membaca seluruh file ke memori sekaligus.
Masalahnya adalah itu tidak skala dengan baik. Anda bisa mengembangkan kode dengan file berukuran wajar, lalu memproduksinya dan tiba-tiba menemukan Anda mencoba membaca file berukuran dalam gigabytes, dan host Anda membeku ketika mencoba membaca dan mengalokasikan memori.
Baris-demi-baris I / O sangat cepat, dan hampir selalu seefektif slurping. Ini ternyata sangat cepat.
Saya suka menggunakan:
atau
File mewarisi dari IO, dan
foreach
ada di IO, jadi Anda bisa menggunakan keduanya.Saya memiliki beberapa tolok ukur yang menunjukkan dampak dari mencoba membaca file besar melalui
read
vs. I-O baris demi baris di " Mengapa" menyeruput "file bukan praktik yang baik? ".sumber
Anda dapat membaca file sekaligus:
Ketika file besar, atau mungkin besar, biasanya lebih baik untuk memprosesnya baris demi baris:
Kadang-kadang Anda ingin akses ke penanganan file atau mengontrol bacaan sendiri:
Dalam hal file biner, Anda dapat menentukan nil-separator dan ukuran blok, seperti:
Akhirnya Anda bisa melakukannya tanpa blok, misalnya saat memproses beberapa file secara bersamaan. Dalam hal ini file tersebut harus ditutup secara eksplisit (ditingkatkan sesuai komentar @antinome):
Referensi: File API dan IO API .
sumber
for_each
dalam File atau IO. Gunakanforeach
sebagai gantinya.while
daripadaloop
menggunakan danensure
untuk memastikan file ditutup bahkan jika pengecualian dinaikkan. Seperti ini (ganti semi-titik dua dengan baris baru):begin; f = File.open('testfile'); while line = f.gets; puts line; end; ensure; f.close; end
.Salah satu metode sederhana adalah dengan menggunakan
readlines
:Setiap baris dalam file input akan menjadi entri dalam array. Metode ini menangani membuka dan menutup file untuk Anda.
sumber
read
halnya varian apa pun, ini akan menarik seluruh file ke dalam memori, yang dapat menyebabkan masalah besar jika file lebih besar dari memori yang tersedia. Selain itu, karena merupakan array, Ruby harus membuat array, memperlambat prosesnya juga.http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-read
sumber
Saya biasanya melakukan ini:
Ini akan memberi Anda seluruh teks sebagai objek string. Ini hanya berfungsi di bawah Ruby 1.9.
sumber
kembalikan n baris terakhir dari your_file.log atau .txt
sumber
Cara yang lebih efisien adalah streaming dengan meminta kernel sistem operasi untuk membuka file, kemudian membaca byte dari file itu sedikit demi sedikit. Saat membaca file per baris di Ruby, data diambil dari file 512 byte sekaligus dan dibagi menjadi "baris" setelah itu.
Dengan buffering konten file, jumlah panggilan I / O berkurang saat membagi file dalam potongan logis.
Contoh:
Tambahkan kelas ini ke aplikasi Anda sebagai objek layanan:
Sebut saja dan berikan
:each
metode ini blok:Baca di sini di pos terperinci ini:
Ruby Magic Slurping & Streaming File Menurut AppSignal
sumber
Saya pikir metode ini adalah yang paling "tidak umum". Mungkin agak sulit, tetapi berfungsi jika
cat
diinstal.sumber
content = File.read(filename)