2010-07-25 15 views
54

Czy w Ruby jest wbudowana funkcja odczytu całego pliku bez użycia pętli? Do tej pory natknąłem się tylko na metody, które czytają w kawałkach (linia lub postać).Jak czytać cały plik w Ruby?

+3

Dla tego, co jest warte, jest to coś, czego ludzie często chcą, ale tak naprawdę nie potrzebują. (A jeśli plik jest bardzo duży, można uzyskać nieprzyjemną niespodziankę, gdy plik siorbiąc gulety zbliża się do całej dostępnej pamięci.) Co ostatecznie próbujesz osiągnąć? – Telemachus

+0

Znalazłem to bardzo pomocne w pracy z plikiem, który nie był w formacie codziennym. Czytałem plik w kodowaniu IBM437 i musiałem złamać plik w dziwnych postaciach, aby oddzielić cenne dane od rzeczy, których nie potrzebowałem. W tym celu sensowne było odczytanie całego pliku, a następnie tworzenie własnych podziałów linii tam, gdzie powinny być. W przeciwnym razie przechodziłbym przez każdą linię lub każdą postać. Zamiast tego mógłbym po prostu użyć tego do odczytania pliku, a następnie użyć podziału, aby podzielić plik na ciągi znaków drukowalnych, a następnie użyć bloku, aby określić zestawy danych, których potrzebuję. – ndw

+0

Polecam lekturę: http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad. –

Odpowiedz

78
IO.read("filename") 

lub

File.read("filename") 
+3

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

+0

Po prostu z ciekawości, dlaczego nie mogę znaleźć tej funkcji tutaj: http://www.ruby-doc.org/core- 2.1.2/File.html –

+4

@MartinKonecny, ponieważ 'File :: read' jest faktycznie dziedziczony z' IO :: read' - oba są dokładnie takie same, ponieważ 'File' rozszerza' IO'. –

18
File.readlines("filename") 

Jest to również świetny sposób, aby przeczytać wszystko z pliku i przełamać podział na powrotu karetki. Zwrot jest tablicą z jedną linią na element.

+10

Dokładniej, 'readlines' dzieli na wewnętrzną zmienną' $/', która domyślnie przyjmuje wartość" \ n ". Możesz jednak tymczasowo zresetować '$ /' i odczytać pliki na porcje ograniczone w inny sposób. – Telemachus

5

Proszę zignorować poradę, która stwierdza: "Nigdy nie należy slurpować (co jest irytującym terminem) do pliku". Czasami jest to bardzo przydatne i rozsądne.

Załóżmy, że czytasz plik wielokrotnie: duża szansa, że ​​odczytywanie pliku do tablicy jest sensowną optymalizacją czytania linii pliku po wierszu, nawet biorąc pod uwagę, że o/s spowoduje buforowanie pliku.

+1

Nie zapewnia to odpowiedzi na pytanie. Aby skrytykować lub poprosić o wyjaśnienie od autora, zostaw komentarz pod swoim postem - zawsze możesz komentować swoje posty, a gdy już masz wystarczającą [reputację] (http://stackoverflow.com/help/whats-reputation), być w stanie [komentować dowolny wpis] (http://stackoverflow.com/help/privileges/comment). - [Z recenzji] (/ recenzja/niskiej jakości-posts/10916920) – ndn

+1

Przepraszamy, ale po prostu nie jest zainteresowany pracą w przedstawicielstwie. Porada "nie slurp" jest po prostu błędna. Czasami jest to przydatna technika (właśnie zmniejszyłem czas wykonywania programu o współczynnik 1000 przez odczytanie całego pliku) i nie powinien on być przestarzały. –

+0

Odczytywanie pliku do pamięci w jednym przebiegu (slurping) nie jest szybsze niż linia po linii, gdy plik osiąga rozmiar 1 MB +. Poza tym punktem możesz szybciej czytać wiersz po wierszu i unikać potencjalnych problemów związanych ze skalowalnością. "po prostu źle" nie jest pomocne bez wyjaśnienia, kiedy jest to właściwe. Aby uzyskać więcej informacji, zobacz http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad. –

Powiązane problemy