2010-07-25 25 views
54

¿Hay una función incorporada en Ruby para leer todo el archivo sin usar ningún bucle? Hasta ahora, solo he encontrado métodos que se leen en fragmentos (línea o carácter).¿Cómo leer todo el archivo en Ruby?

+3

Por lo que vale, esto es algo que la gente a menudo quiere pero realmente no necesita. (Y si el archivo es muy grande, puede obtener una desagradable sorpresa cuando la sordera de un archivo engulle cerca de toda su memoria disponible.) ¿Qué está tratando de lograr en última instancia? – Telemachus

+0

Encontré esto muy útil para trabajar con un archivo que no estaba en un formato diario. Estaba leyendo un archivo con codificación IBM437 y necesitaba dividir el archivo en los personajes extraños para separar los datos valiosos de los que no necesitaba. Para eso, tenía sentido leer el archivo completo y luego crear mis propios saltos de línea donde deberían estar. De lo contrario, estaría pasando en cada línea o cada personaje. En su lugar, podría simplemente usar esto para leer el archivo, y luego usar división para dividir el archivo en cadenas de caracteres imprimibles, y luego usar un bloque para determinar los conjuntos de datos que necesito. – ndw

+0

Recomiendo leer http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad. –

Respuesta

78
IO.read("filename") 

o

File.read("filename") 
+3

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

+0

Solo por curiosidad, ¿por qué no puedo encontrar esta función aquí: http://www.ruby-doc.org/core- 2.1.2/File.html –

+4

@MartinKonecny ​​porque 'File :: read' en realidad se hereda de' IO :: read'; ambos son exactamente iguales porque 'File' se extiende' IO'. –

18
File.readlines("filename") 

Esto también es un gran método para leer todo, desde un archivo y romper dividida en retornos de carro. El retorno es una matriz con una línea por elemento.

+10

Más específicamente, 'readlines' se divide en la variable interna' $/', que por defecto es" \ n ". Sin embargo, puede restablecer temporalmente '$ /' y leer los archivos en trozos delimitados de otras maneras. – Telemachus

5

Por favor, ignore el consejo que dice "Nunca debe sorber (que es el término molesto para esto) un archivo". Algunas veces esto es algo muy útil y sensato.

Supongamos que está leyendo un archivo varias veces: es posible que leer el archivo en una matriz sea una optimización sensata al leer el archivo línea por línea, incluso teniendo en cuenta que el o el archivo almacenará en caché el archivo.

+1

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones, y una vez que tenga suficiente [reputación] (http://stackoverflow.com/help/whats-reputation) lo hará poder [comentar cualquier publicación] (http://stackoverflow.com/help/privileges/comment). - [De la crítica] (/ review/low-quality-posts/10916920) – ndn

+1

Lo siento, pero simplemente no estoy interesado en crear un representante. El consejo de "no sorber" es simplemente incorrecto. A veces es una técnica útil (acabo de reducir el tiempo de ejecución de un programa en un factor de 1000 al leer todo el archivo), y no debe ser desaprobado. –

+0

Leer un archivo en la memoria de una vez (sorber) no es más rápido que línea por línea una vez que un archivo alcanza 1MB de tamaño. Más allá de ese punto, puede leer línea por línea más rápido y evitar posibles problemas de escalabilidad. "simplemente incorrecto" no es útil sin explicar cuándo es apropiado. Consulte http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad para obtener más información. –

Cuestiones relacionadas