루비로 파일에 쓰는 법?


572

데이터베이스에서 데이터를 읽은 다음 텍스트 파일로 저장해야합니다.

루비에서 어떻게 할 수 있습니까? Ruby에 파일 관리 시스템이 있습니까?

답변:


179

루비의 파일 클래스는 당신에게 기능과의 아웃 줄 것이다 ::new::open하지만 부모의 IO 클래스 의 깊이에, 도착을 #read하고 #write.


6
감사합니다 @Geoff. 새로운 사용자가 오래된 질문과 답변을 정리하는 것이 좋습니다. 전반적으로 더 나은 사이트를 만듭니다.
jdl

7
나는이 아이러니를 발견한다. 답변은 매우 잘 문서화되어 있지만 1 년 후이 질문은 Google에서 첫 번째로 제기 된 질문입니다. 질문을 받았을 때 OP가 거의 노력을 기울이지 않았지만 지금은 Google에 관한 한 이것이 가장 좋은 출처입니다.
Jeff

7
아마 당신이 정말로 알아야 할 모든 것이 여기에 있기 때문일 것입니다. 자세한 내용을 읽고 싶은 사람들에게는 "사람에게 물고기를 가르치십시오"라는 대답이 있습니다. 잘라서 붙여 넣기를 원하는 사람들에게도 "남자에게 물고기를주십시오"라는 대답이 많이 있습니다. 이 조합이 Google에서 순위가 ​​높다는 것은 놀라운 일이 아닙니다.
jdl

1
그래서 공정하게, 나는 많은 다른 언어로 일하기 때문에 특정 언어의 구문을 거의 기억하지 못합니다. 나는 이것을 몇 번 봤는데, 항상 이 답변을 지나서 아래 답변으로 스크롤 합니다. : p 솔직히 두 가지 모두를 갖는 것이 좋습니다. 아마도 언젠가는 세부 사항에 관심을 가질 정도로 충분한 루비를 한 번에 수행 할 것입니다.
user435779

2
이것은 질문에 대답하지 않습니다. I / O를 수행하는 대부분의 메소드를 포함하는 두 클래스를 가리키고 데이터베이스와의 연결에 대해서는 언급하지 않습니다. 그것은 의견으로는 좋지만 대답으로 거의 자격이 없습니다. 나는 OP 와이 답변을 찬성 한 많은 독자들이 동의하지 않는다는 것을 알고 있으며 솔직히 그들이 생각하는 것을 이해하지 못합니다.
캐리 스월 랜드

929

다음을 찾고 있습니까?

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

8
yourfile쓸 파일 이름이 들어있는 변수입니다.
B Seven

17
또는 f = File.open ( 'name', 'w'); f.write ( 'text'); f.close
vish

5
@vish : f.write예외가 발생 하면 파일 디스크립터가 열린 채로 있기 때문에이 솔루션을 권장하지 않습니다 .
nbarraille

288
짧고 달콤한 :File.write('filename', 'content')
Benjamin Oakes

14
더 짧고 문서화 됨 :IO.write('filename', 'content')
Thai

636

짧은 버전을 사용할 수 있습니다.

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

쓴 길이를 반환합니다. 자세한 내용과 옵션 은 :: write 를 참조하십시오.

파일이 이미 존재하는 경우 파일에 추가하려면 다음을 사용하십시오.

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

14
참고로이 속기 방법은 Ruby 1.9.3부터 작동합니다. 이전 버전 1.9 또는 1.8에서는 이러한 방법이 없습니다. 이 경우 @mvndaai에 의해 게시 된 더 긴 차단 방법을 사용해야합니다
Andrew Burns

13
참고로 완료되면 파일을 올바르게 닫습니다.
Freedom_Ben

2
IO 수준의 문서가 이 파일을 닫습니다하지 말
nruth

7
이 파일에 추가 됩니까 아니면 그냥 덮어 쓰겠습니까?
Joshua Pinter

8
@JoshPinter : 덮어 씁니다.
mklement0

248

대부분의 경우이 방법이 선호됩니다.

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

블록이로 전달되면 블록이 File.open종료 될 때 File 객체가 자동으로 닫힙니다.

에 블록을 전달하지 않으면 File.open파일이 올바르게 닫히고 내용이 파일에 쓰여 졌는지 확인해야합니다.

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

설명서 에서 찾을 수 있습니다 .

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;
}

예, {| file |과 함께 블록 구문 사용 ....}는 블록이 닫힐 때 파일을 닫습니다.
wesgarrison

감사합니다. 나는 그것에 대해 확신하지 못했습니다. 다음은 블록 및 File.open blog.rubybestpractices.com/posts/rklemme/ 에 대한 자세한 정보 입니다. 공식 문서에도 언급되어 있습니다.
Tombart

1
루비 방식의 무언가 : nil은 객체이므로 파일이 null인지 확인하려면 파일 자체를 비교하는 대신 객체 자체에게 물어보십시오 (file == nil 대신 file.nil?)
JCabello

@JCabello는 확실히 루비와 비슷한 접근법입니다. 감사합니다!
Tombart

마지막으로 공개 통화를 표시하는 하나의 라이너가 아니라 파일 상태와 파일 처리 방법도 확인해야한다는 답변이 표시됩니다.
Nasser

115

여기 에있는 Zambri 의 답변 이 최고입니다.

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

옵션 <OPTION>은 다음과 같습니다.

r-읽기 전용 파일이 존재해야합니다.

w -쓸 빈 파일을 만듭니다.

a -파일에 추가 파일이 없으면 생성됩니다.

r+-읽기와 쓰기 모두를 위해 파일을 엽니 다. 파일이 존재해야합니다.

w+ -읽고 쓰기위한 빈 파일을 만듭니다.

a+-읽고 추가 할 파일을 엽니 다. 파일이 없으면 작성됩니다.

귀하의 경우에 w바람직합니다.


다른 답변을 인정하는 대답이 100 개가 넘는 공감대를받을 수 있다는 사실에 놀랐습니다. 첫 번째 문장을 질문에 대한 의견으로 게시하는 것을 볼 수 있지만 그게 다입니다.
캐리 스월 랜드

@CarySwoveland 나는 실제로 당신에 동의합니다. 실제 문제는 두 질문 중 하나가 오래 전에 중복으로 표시되어 있어야한다는 것입니다. zanbri가 대답 한 질문을 발견하고 같은 정보가 필요할 때 다음 몇 번 이이 질문을 먼저 보았고 다른 질문을 얻는 방법을 알아 내야했기 때문에 대답을 복사했습니다. 결국, 나는 여기에 그의 대답을 얻는 것이 더 쉬울 것이라고 생각했습니다. 나는 그의 대답에 너무나 잘 연결되어 사람들이 클릭을하여 그에게 투표권을 줄 것이다.
mvndaai

31

모범을 통해 배우는 우리에게는 ...

다음과 같이 파일에 텍스트를 작성하십시오.

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

보너스 정보 ...

이렇게 다시 읽어

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

자주, 나는 클립 보드에 파일을 읽고 싶어 ***

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

그리고 다른 경우에는 클립 보드에있는 내용을 파일에 쓰고 싶습니다 ***

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

*** 클립 보드 젬이 설치되어 있다고 가정

참조 : https://rubygems.org/gems/clipboard


1
조심 IO.write옵션 덮어 쓰기 대신 APPEND의 파일 내용을. IO.write로 추가하는 것은 약간 지루합니다.
fguillen

무슨 말을하는지 모르겠습니까? IO.write 명령은 파일에 쓰기 위해 해당 옵션이 필요하지 않습니다. 파일을 / tmp 디렉토리 또는 현재 디렉토리에 저장하는 데주의해야합니다. 그렇지 않으면 Errno::ENOENT: No such file or directory @ rb_sysopen메시지와 파일이 0 바이트 크기로 생성 된 것을 볼 수 있습니다 .
l3x

25

파일의 이전 내용을 삭제하려면 파일에 새 문자열을 작성하십시오.

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

이전 내용을 덮어 쓰지 않고 파일에 추가하려면

open('myfile.txt', "a") { |f| f << 'I am appended string' } 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.