2010-07-25 8 views
54

Esiste una funzione integrata in Ruby per leggere l'intero file senza utilizzare alcun ciclo? Finora, ho incontrato solo metodi che leggono in blocchi (linea o carattere).Come leggere l'intero file in Ruby?

+3

Per quello che vale, questo è qualcosa che le persone spesso vogliono ma di cui non hanno veramente bisogno. (E se il file è molto grande, puoi avere una brutta sorpresa quando file inghiottiti divorano vicino a tutta la tua memoria disponibile). Cosa stai cercando in definitiva di realizzare? – Telemachus

+0

L'ho trovato molto utile per lavorare con un file che non era in un formato per tutti i giorni. Stavo leggendo un file nella codifica IBM437 e avevo bisogno di rompere il file nei caratteri oddball, per separare i dati preziosi dalle cose che non mi servivano. Per questo ha senso leggere l'intero file e quindi creare le mie interruzioni di riga dove dovrebbero essere. Altrimenti passerei in ogni riga o ogni personaggio. Invece, potrei semplicemente usarlo per leggere il file, e quindi usare split per spezzare il file su stringhe di caratteri stampabili, e quindi usare un blocco per determinare i set di dati di cui ho bisogno. – ndw

+0

Consiglierei di leggere http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad. –

risposta

78
IO.read("filename") 

o

File.read("filename") 
+3

Documenti: http://ruby-doc.org/core/classes/IO.html – quantumSoup

+0

Solo per curiosità, perché non riesco a trovare questa funzione qui: http://www.ruby-doc.org/core- 2.1.2/File.html –

+4

@MartinKonecny ​​perché 'File :: read' è in realtà ereditato da' IO :: read' - entrambi sono esattamente gli stessi perché 'File' estende' IO'. –

18
File.readlines("filename") 

Questo è anche un ottimo metodo per leggere tutto da un file e rompere parti separate su ritorni a capo. Il ritorno è una matrice con una riga per elemento.

+10

In particolare, 'readlines' si divide sulla variabile interna' $/', che assume come valore predefinito" \ n ". È possibile ripristinare temporaneamente '$ /', tuttavia, e leggere i file in blocchi delimitati anche in altri modi. – Telemachus

5

Si prega di ignorare i consigli che indicano "Non si dovrebbe mai borbottare (che è il termine fastidioso per questo) un file". A volte questa è una cosa molto utile e ragionevole da fare.

Supponiamo che stai leggendo un file più volte: buona probabilità che la lettura del file in un array è un'ottimizzazione ragionevole sopra la lettura del file riga per riga, anche tenendo conto che l'o/s sarà memorizzare nella cache il file.

+1

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). - [Dalla recensione] (/ recensione/post di bassa qualità/10916920) – ndn

+1

Siamo spiacenti, ma semplicemente non mi interessa lavorare su un rappresentante. Il consiglio di "non bersi" è semplicemente sbagliato. A volte è una tecnica utile (ho appena ridotto il tempo di esecuzione di un programma di un fattore di 1000 leggendo l'intero file) e non dovrebbe essere deprecato. –

+0

La lettura di un file in memoria in un passaggio (slurping) non è più veloce di una volta che un file raggiunge 1 MB di dimensione. Oltre questo punto è possibile leggere riga per riga più rapidamente ed evitare potenziali problemi di scalabilità. "semplicemente sbagliato" non è utile senza spiegare quando è appropriato. Vedi http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad per ulteriori informazioni. –