2010-07-25 16 views
54

Gibt es in Ruby eine eingebaute Funktion, um die ganze Datei ohne eine Schleife zu lesen? Bisher bin ich nur auf Methoden gestoßen, die Chunks (Zeile oder Zeichen) lesen.Wie liest man ganze Dateien in Ruby?

+3

Für was es wert ist, das ist etwas, was Menschen oft wollen, aber nicht wirklich brauchen. (Und wenn die Datei sehr groß ist, kann es zu einer unangenehmen Überraschung kommen, wenn Dateien in der Nähe Ihres gesamten verfügbaren Speicherplatzes verschlingen.) Was versuchen Sie letztendlich zu erreichen? – Telemachus

+0

Ich fand dies sehr hilfreich für die Arbeit mit einer Datei, die nicht im täglichen Format war. Ich las eine Datei in IBM437-Codierung und musste die Datei bei den komischen Zeichen zerlegen, um die wertvollen Daten von den Dingen zu trennen, die ich nicht brauchte. Dazu hat es Sinn gemacht, die gesamte Datei zu lesen und dann eigene Zeilenumbrüche dort zu erstellen, wo sie sein sollten. Sonst würde ich jede Zeile oder jeden Charakter weitergeben. Stattdessen könnte ich das einfach verwenden, um die Datei zu lesen, und dann die Datei durch Teilen in Zeilen mit druckbaren Zeichen aufteilen und dann einen Block verwenden, um die benötigten Datenmengen zu bestimmen. – ndw

+0

Ich würde empfehlen http://StackOverflow.com/questions/25189262/why-is-slurping-a-file-bad zu lesen. –

Antwort

78
IO.read("filename") 

oder

File.read("filename") 
+3

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

+0

Nur aus Neugier, warum kann ich diese Funktion hier nicht finden: http://www.ruby-doc.org/core- 2.1.2/File.html –

+4

@MartinKonecny ​​weil 'File :: read' eigentlich von' IO :: read' geerbt wird - beide sind genau gleich, weil 'File'' IO' erweitert. –

18
File.readlines("filename") 

Dies ist auch eine gute Methode, alles aus einer Datei und bricht Split auf Zeilenumbrüche zu lesen. Die Rückgabe ist ein Array mit einer Zeile pro Element.

+10

Genauer gesagt, 'readlines' teilt sich in die interne Variable' $/', die standardmäßig auf" \ n "steht. Sie können jedoch '$ /' vorübergehend zurücksetzen und Dateien auch in anderen Bereichen lesen. – Telemachus

5

Bitte ignorieren Sie den Hinweis, der besagt "Sie sollten nie schlürfen (was der nervige Begriff dafür ist) eine Datei". Manchmal ist das eine sehr nützliche und sinnvolle Sache.

Angenommen, Sie lesen eine Datei wiederholt: gute Chance, dass das Lesen der Datei in ein Array eine sinnvolle Optimierung gegenüber dem Lesen der Datei Zeile für Zeile ist, auch wenn die o/s die Datei zwischenspeichern.

+1

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag - du kannst deine eigenen Beiträge jederzeit kommentieren, und sobald du genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) hast, wirst du das tun in der Lage sein [jeden Beitrag kommentieren] (http://stackoverflow.com/help/privileges/comment). - [Aus Bewertung] (/ review/low-quality-posts/10916920) – ndn

+1

Sorry, aber einfach nicht daran interessiert, einen Vertreter zu erarbeiten. Der Tipp "nicht schlürfen" ist einfach falsch. Es ist manchmal eine nützliche Technik (ich habe gerade die Laufzeit eines Programms um den Faktor 1000 reduziert, indem ich die ganze Datei gelesen habe) und sollte nicht veraltet sein. –

+0

Das Lesen einer Datei in einem Arbeitsgang (slurping) ist nicht schneller als Zeile für Zeile, sobald eine Datei 1MB + groß ist. Darüber hinaus können Sie Zeilen für Zeile schneller lesen und potenzielle Skalierbarkeitsprobleme vermeiden. "einfach falsch" ist nicht hilfreich, ohne zu erklären, wann es angemessen ist. Weitere Informationen finden Sie unter http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad. –