2010-05-06 16 views
450

Potrzebuję odczytać dane z bazy danych, a następnie zapisać je w pliku tekstowym.Jak pisać do pliku w Ruby?

Jak mogę to zrobić w Ruby? Czy istnieje jakiś system zarządzania plikami w Ruby?

Odpowiedz

153

Ruby File class daje tajniki ::new i ::open ale jego rodzica, IO class, dostaje się do głębokości #read i #write.

+5

Dzięki @Geoff. Dobrze jest widzieć nowych użytkowników czyszczących przestarzałe pytania i odpowiedzi. Tworzy lepszą stronę ogólnie. – jdl

+5

Uważam to za ironiczne. Odpowiedź jest bardzo dobrze udokumentowana ... ale teraz, rok później, to pytanie jest pierwszym hitem w Google. Kiedy zadano pytanie, mogło się wydawać, że OP poświęca mało uwagi, ale teraz, jeśli chodzi o Google, jest to najlepsze źródło. – Jeff

+6

Prawdopodobnie dlatego, że wszystko, co naprawdę potrzebujesz wiedzieć, jest tutaj. Mój jest odpowiedzią "naucz mężczyznę łowić ryby" dla tych, którzy chcą czytać najdrobniejsze szczegóły, i jest mnóstwo odpowiedzi "daj człowiekowi ryby" także dla osób, które chcą tylko wycinać i wklejać. Nic dziwnego, że ta kombinacja kończy się dobrze w rankingu w Google. – jdl

786

Szukasz następujących produktów?

File.open(yourfile, 'w') { |file| file.write("your text") } 
+2

Prawdopodobnie zwraca liczbę dotkniętych znaków. Potrzebuję obiektu pliku w zamian. Jakieś pomysły? – Prem

+5

'yourfile' jest zmienną zawierającą nazwę pliku, który ma zostać zapisany. –

+11

Alternatywnie: f = File.open ("name", "w"); f.write ("tekst"); f.close – vish

211

Jest to korzystne podejście w większości przypadków:

File.open(yourfile, 'w') { |file| file.write("your text") } 

Kiedy blok jest przekazywana do File.open, obiekt File zostanie automatycznie zamknięte, gdy blok kończy.

Jeśli nie przekazujesz bloku do File.open, musisz upewnić się, że plik jest poprawnie zamknięty, a zawartość została zapisana do pliku.

begin 
    file = File.open("/tmp/some_file", "w") 
    file.write("your text") 
rescue IOError => e 
    #some error occur, dir not writable etc. 
ensure 
    file.close unless file.nil? 
end 

Można go znaleźć w documentation:

static VALUE rb_io_s_open(int argc, VALUE *argv, VALUE klass) 
{ 
    VALUE io = rb_class_new_instance(argc, argv, klass); 
    if (rb_block_given_p()) { 
     return rb_ensure(rb_yield, io, io_close, io); 
    } 
    return io; 
} 
+0

Tak, używając składni bloków z {| file | ....} zamknie plik, gdy blok się zamknie. – wesgarrison

+0

Fajnie, dzięki. Nie byłem tego pewien. Oto kilka informacji o blokach i 'File.open' http://blog.rubybestpractices.com/posts/rklemme/001-Using_blocks_for_Robustness.html jest również wspomniany w oficjalnej dokumentacji – Tombart

+1

Po prostu coś w stylu ruby: zero jest obiektem, więc aby sprawdzić, czy plik jest pusty, pytasz sam obiekt zamiast porównywać (plik.nil? zamiast pliku == zero) – JCabello

99

Zambri „s odpowiedź found here jest najlepszy.

File.open("out.txt", '<OPTION>') {|f| f.write("write your stuff here") } 

gdzie opcje <OPTION> są:

r - Tylko do odczytu. Plik musi istnieć.

w - Utwórz pusty plik do zapisu.

a - Dołącz do pliku. Plik jest tworzony, jeśli nie istnieje.

r+ - Otwórz plik, aby zaktualizować odczyt i zapis. Plik musi istnieć.

w+ - Utwórz pusty plik zarówno do odczytu, jak i zapisu.

a+ - Otwórz plik do czytania i dołączania. Plik zostanie utworzony, jeśli nie istnieje.

W twoim przypadku preferujemy w.

476

Można używać skróconej wersji:

File.write('/path/to/file', 'Some glorious content') 

Zwraca długość pisemnej; patrz ::write, aby uzyskać więcej informacji i opcji.

+13

FYI ta skrócona metoda działa tylko zaczynając od Ruby 1.9.3. Nie ma takiej metody we wcześniejszych wersjach wersji 1.9 lub 1.8. W takim przypadku musisz użyć metody dłuższego bloku opublikowanej przez @mvndaai –

+7

FYI, to właściwie zamknie plik po zakończeniu. –

+2

[Dokumenty z klasy IO] (http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-write) mówią, że zamyka plik – nruth

29

Dla tych z nas, którzy uczą się przez przykład ...

Wpisywanie tekstu do pliku jak poniżej:

IO.write('/tmp/msg.txt', 'hi') 

BONUS INFO ...

Przeczytaj go z powrotem jak to

IO.read('/tmp/msg.txt') 

Często Chcę odczytać plik do mojego schowek ***

Clipboard.copy IO.read('/tmp/msg.txt') 

, a innym razem, chcę napisać, co jest w moim schowku do pliku ***

IO.write('/tmp/msg.txt', Clipboard.paste) 

*** Zakłada masz gem schowka zainstalowany

Patrz: https://rubygems.org/gems/clipboard

+0

Uważaj na opcję 'IO.write' ** nadpisuj ** zawartość pliku zamiast dopisz. Dołączanie do IO.write jest nieco nudne. – fguillen

+0

Nie jesteś pewien, o czym mówisz? Polecenie IO.write nie potrzebuje tej opcji do zapisu do pliku. Byłbym ostrożny, aby zapisać plik w katalogu/tmp lub w bieżącym katalogu; W przeciwnym razie może pojawić się komunikat 'Errno :: ENOENT: No such file lub directory @ rb_sysopen' i plik utworzony z rozmiarem 0 bajtów. – l3x

14

zniszczyć poprzednia zawartość pliku, a następnie napisać nowy ciąg do pliku:

open('myfile.txt', 'w') { |f| f << "some text or data structures..." } 

dołączyć do pliku bez zastępowania swoich starych zawartość:

open('myfile.txt', "a") { |f| f << 'I am appended string' }