रूबी में फाइल करने के लिए कैसे लिखें?


571

मुझे डेटाबेस से डेटा को पढ़ने की आवश्यकता है और फिर इसे एक पाठ फ़ाइल में सहेजें।

रूबी में मैं कैसे कर सकता हूं? क्या रूबी में कोई फ़ाइल प्रबंधन प्रणाली है?

जवाबों:


178

रूबी फ़ाइल वर्ग आप इन और का बहिष्कार दे देंगे ::newऔर ::openलेकिन इसके जनक, आईओ वर्ग , की गहराई में हो जाता है #readऔर #write


6
धन्यवाद @Geoff नए उपयोगकर्ताओं को पुराने प्रश्नों और उत्तरों को साफ करते हुए देखना अच्छा है। समग्र रूप से एक बेहतर साइट के लिए बनाता है।
jdl

7
मुझे यह विडंबना लगती है। जवाब बहुत अच्छी तरह से प्रलेखित है ... लेकिन अब एक साल बाद, यह सवाल Google पर पहली बार आया है। जब सवाल पूछा गया, तो ऐसा लग सकता है कि ओपी थोड़ा प्रयास समर्पित कर रहा था, लेकिन अब जहां तक ​​Google का सवाल है, यह सबसे अच्छा स्रोत है।
जेफ

7
शायद इसलिए कि सब कुछ जो आपको वास्तव में जानना आवश्यक है, वह यहां है। खान उन लोगों के लिए "मछली को एक आदमी को पढ़ाना" उत्तर है जो बारीक विवरण पढ़ना चाहते हैं, और यहां "एक आदमी को एक मछली देना" उत्तर के साथ-साथ उन लोगों के लिए भी बहुत सारे हैं जो सिर्फ कट-एंड-पेस्ट करना चाहते हैं। यह आश्चर्य की बात नहीं है कि यह संयोजन Google पर अच्छी तरह से रैंक किया गया है।
jdl

1
इसलिए, निष्पक्षता में, मैं कई अलग-अलग भाषाओं में काम करता हूं, जिसका मतलब है कि मैं किसी भी विशिष्ट के लिए वाक्यविन्यास को याद करने के लिए शायद ही कभी आसपास होता हूं। मैंने इसे कुछ बार देखा है, और मैं हमेशा इस उत्तर को पिछले नीचे स्क्रॉल करता हूं , इसके नीचे वाले को, क्योंकि जब मैं Google StackOverflow करता हूं तो मैं आमतौर पर एक खतरे वाली मछली की तलाश में हूं। : पी ईमानदारी से यह दोनों अच्छा है। शायद किसी दिन मैं एक बार में पर्याप्त रूबी करूंगा कि मैं विवरणों के बारे में परवाह करूंगा।
user435779

2
इस सवाल का जवाब नहीं है। यह केवल उन दो वर्गों को इंगित करता है जिनमें I / O करने के अधिकांश तरीके हैं, और डेटाबेस के साथ कनेक्शन का कोई उल्लेख नहीं करता है। यह एक टिप्पणी के रूप में ठीक होगा, लेकिन उत्तर के रूप में शायद ही योग्य हो। मुझे पता है कि ओपी और कई पाठकों ने इस उत्तर को असहमति जताई, और मुझे स्पष्ट रूप से समझ में नहीं आया कि वे क्या सोच रहे थे।
कैरी स्वेवेलैंड

929

क्या आप निम्नलिखित की तलाश कर रहे हैं?

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

8
yourfileएक वैरिएबल होता है जो कि लिखे जाने वाली फ़ाइल का नाम रखता है।
बी सेवन

17
वैकल्पिक रूप से: f = File.open ('नाम', 'w'); f.write ( 'पाठ'); f.close
vish

5
@vish: यदि f.writeकोई अपवाद उठाता है तो मैं इस समाधान की अनुशंसा नहीं करूंगा क्योंकि फ़ाइल डिस्क्रिप्टर को खुला छोड़ दिया जाएगा ।
नबरेल

288
लघु और मधुर:File.write('filename', 'content')
बेंजामिन

14
इससे भी छोटा और प्रलेखित:IO.write('filename', 'content')
थाई

636

आप लघु संस्करण का उपयोग कर सकते हैं:

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

यह लिखी गई लंबाई लौटाता है; देखें :: अधिक विवरण और विकल्पों के लिए लिखें

फ़ाइल में संलग्न करने के लिए, यदि यह पहले से मौजूद है, तो उपयोग करें:

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

14
FYI करें यह शॉर्टहैंड विधि केवल रूबी 1.9.3 के साथ शुरुआत करती है। 1.9 या 1.8 के किसी भी पुराने संस्करण में ऐसी कोई विधि नहीं है। उस स्थिति में आपको @mvndaai
एंड्रयू बर्न्स

13
समाप्त होने पर फ़ाइल को ठीक से बंद कर देता है।
फ्रीडम_बिन

2
IO वर्ग के डॉक्स का कहना है कि यह फाइल को बंद कर देता है
nruth

7
क्या यह एक फ़ाइल में संलग्न होगा या सिर्फ इसे अधिलेखित करेगा?
जोशुआ पिंटर

8
@JoshPinter: यह ओवरराइट करता है।
mklement0

248

यह ज्यादातर मामलों में पसंदीदा तरीका है:

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

जब एक ब्लॉक को पास किया जाता है File.open, तो ब्लॉक समाप्त होने पर फ़ाइल ऑब्जेक्ट स्वचालित रूप से बंद हो जाएगा।

यदि आप किसी ब्लॉक को पास नहीं करते हैं 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;
}

हाँ, {| फ़ाइल के साथ ब्लॉक सिंटैक्स का उपयोग करना ....} ब्लॉक बंद होने पर फ़ाइल को बंद कर देगा।
wesgarrison

अच्छा है धन्यवाद। मुझे उस पर यकीन नहीं था। यहाँ ब्लॉक्स और File.open ब्लॉग के बारे में कुछ और जानकारी दी गई है ।rubybestpractices.com/posts/rklemme/… यह आधिकारिक दस्तावेज में भी उल्लिखित है
टॉमबार्ट

1
बस कुछ रूबी रास्ता- ish: nil एक ऑब्जेक्ट है, इसलिए यह जांचने के लिए कि क्या कोई फ़ाइल अशक्त है, आप ऑब्जेक्ट को तुलना करने के बजाय खुद से पूछते हैं (file.nil? File == nil के बजाय)
JCabello

@Jabello यकीन है, कि निश्चित रूप से अधिक रूबी की तरह दृष्टिकोण है, धन्यवाद!
मकबरा

अंत में एक उत्तर जो दिखाता है कि किसी को फ़ाइल स्थिति की जांच करनी चाहिए और इसे कैसे संभालना चाहिए, न कि केवल एक लाइनर जो सिर्फ खुली कॉल दिखाता है।
नासिर

115

जाम्बरी का यहाँ पाया गया उत्तर सबसे अच्छा है।

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

आपके विकल्प कहां <OPTION>हैं:

r- सिफ़ पढ़िये। फ़ाइल मौजूद होनी चाहिए।

w - लिखने के लिए एक खाली फाइल बनाएं।

a - अगर यह मौजूद नहीं है, तो एक फ़ाइल में संलग्न करें। फ़ाइल बनाई गई है।

r+- पढ़ने और लिखने दोनों को अपडेट करने के लिए एक फ़ाइल खोलें। फ़ाइल मौजूद होनी चाहिए।

w+ - पढ़ने और लिखने दोनों के लिए एक खाली फाइल बनाएं।

a+- पढ़ने और संलग्न करने के लिए एक फ़ाइल खोलें। यदि मौजूद नहीं है तो फ़ाइल बनाई जाती है।

आपके मामले में, wबेहतर है।


मुझे लगता है कि एक जवाब है कि भर्ती एक और जवाब 100 से अधिक upvotes प्राप्त कर सकता है कंपित है। मैं इस प्रश्न पर टिप्पणी के रूप में पहला वाक्य पोस्ट कर सकता हूं, लेकिन यह है।
कैरी स्वेवेलैंड

@CarySwoveland मैं वास्तव में आपके साथ सहमत हूँ। वास्तविक समस्या यह है कि दो प्रश्नों में से एक को बहुत पहले एक डुप्लिकेट के रूप में चिह्नित किया जाना चाहिए था। मैंने जवाब को कॉपी किया क्योंकि एक बार जब मुझे सवाल मिला तो zanbri ने जवाब दिया था और अगली बार जब मुझे उसी जानकारी की आवश्यकता थी तो मुझे पहले इस प्रश्न के बारे में पता चला और दूसरे प्रश्न के बारे में पता लगाना था। आखिरकार, मुझे लगा कि यहां उसका जवाब देना आसान होगा। मैं उनके जवाब से इतनी उम्मीद से जुड़ा था, लोग उस पर क्लिक करते और उसे भी उभार देते।
मवंडई

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विकल्प अधिलेखित संलग्न के बजाय फ़ाइल सामग्री। 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' } 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.