2013-06-20 16 views
32

से एक सूची लिखें और पढ़ें यह थोड़ा अजीब अनुरोध है लेकिन मैं फ़ाइल में एक सूची लिखने का एक तरीका ढूंढ रहा हूं और फिर इसे किसी अन्य समय वापस पढ़ता हूं।पायथन 2.7 - फ़ाइल

मेरे पास सूचियों को रीमेक करने का कोई तरीका नहीं है ताकि वे नीचे दिए गए उदाहरण के रूप में सही तरीके से गठित/स्वरूपित हों।

test 
data 
here 
this 
is one 
group :) 

test 
data 
here 
this 
is another 
group :) 

उत्तर

92

आप इसे मानव पठनीय/संपादन योग्य होने की जरूरत नहीं है, तो सबसे आसान समाधान सिर्फ pickle उपयोग करने के लिए है:

मेरे सूचियों निम्नलिखित की तरह डेटा है।

लिखने के लिए:

with open(the_filename, 'wb') as f: 
    pickle.dump(my_list, f) 

पढ़ने के लिए:

with open(the_filename, 'rb') as f: 
    my_list = pickle.load(f) 

तुम क्या हैं जरूरत है उन्हें मानव पठनीय होने के लिए, हमें और जानकारी चाहिए।

तो my_list सिर्फ उन्हें एक प्रति पंक्ति लिख नहीं एम्बेडेड नई-पंक्तियों के साथ स्ट्रिंग की एक सूची होने की गारंटी है,:

with open(the_filename, 'w') as f: 
    for s in my_list: 
     f.write(s + '\n') 

with open(the_filename, 'r') as f: 
    my_list = [line.rstrip('\n') for line in f] 

वे बाइट तार के बजाय यूनिकोड तार कर रहे हैं, तो आप करेंगे encode उन्हें चाहते हैं। (या, बदतर, अगर वे बाइट स्ट्रिंग हैं, लेकिन आपके सिस्टम के डिफ़ॉल्ट के समान एन्कोडिंग में जरूरी नहीं है।)

यदि उनके पास न्यूलाइन, या गैर-प्रिंट करने योग्य वर्ण आदि हो सकते हैं, तो आप भागने या उद्धरण का उपयोग कर सकते हैं । पायथन में stdlib में निर्मित विभिन्न प्रकार के भागने हैं।

के एक बार में ऊपर की समस्याओं का हल करने के लिए दोनों यहाँ unicode-escape उपयोग करते हैं:

with open(the_filename, 'w') as f: 
    for s in my_list: 
     f.write((s + u'\n').encode('unicode-escape')) 

with open(the_filename, 'r') as f: 
    my_list = [line.decode('unicode-escape').rstrip(u'\n') for line in f] 

तुम भी या तो codecs मॉड्यूल या साथ, 2.x में 3.x शैली समाधान का उपयोग कर सकते io मॉड्यूल: *

import io 

with io.open(the_filename, 'w', encoding='unicode-escape') as f: 
    f.writelines(line + u'\n' for line in my_list) 

with open(the_filename, 'r') as f: 
    my_list = [line.rstrip(u'\n') for line in f] 

* TOOWTDI, तो जो एक स्पष्ट तरीका है? यह निर्भर करता है ... लघु संस्करण के लिए: यदि आपको 2.6 से पहले पायथन संस्करणों के साथ काम करने की आवश्यकता है, तो codecs का उपयोग करें; यदि नहीं, io का उपयोग करें।

+0

मुझे अचार पुस्तकालय पसंद है, यह बहुत प्यारा है और पूरी तरह से काम करता है।मैंने इसे पहले ही कार्यान्वित कर लिया है और ऐसा लगता है कि यह ठीक काम कर रहा है। धन्यवाद, मैं आपको हरे रंग की टिक के रूप में चिह्नित करता हूं जैसे ही यह मुझे देता है। – Ryflex

+0

यूनिकोड-एस्केप ... मुझे टाइपरर की वजह से इसे 'wb' के रूप में खोलना पड़ा: स्ट्रेट होना चाहिए, बाइट्स – rluks

+0

@ Pan.student: आप Python 3.x का उपयोग कर रहे हैं, है ना? पायथन 2 में, यह प्रश्न क्या पूछ रहा था, 'str' और' बाइट्स 'एक ही प्रकार के हैं, और बाइनरी फ़ाइलों और टेक्स्ट फ़ाइलों के बीच का अंतर सिर्फ न्यूलाइन अनुवाद है। पायथन 3 में, 'str' और' यूनिकोड 'एक ही प्रकार के होते हैं, और बाइनरी फ़ाइलों और टेक्स्ट फ़ाइलों के बीच का अंतर यह है कि पाठ फ़ाइलें स्वचालित रूप से आपके लिए एन्कोड और डीकोड करती हैं। (यदि आप io.open' के साथ 3.x-style टेक्स्ट फ़ाइलों सहित सावधान रहें, तो 3.x-like व्यवहार प्राप्त कर सकते हैं, लेकिन पूछताछ ऐसा नहीं कर रहा था।) – abarnert

12

जब तक आपके फ़ाइल सतत प्रारूपण (यानी लाइन टूट जाता है) है, यह सिर्फ बुनियादी फ़ाइल आईओ और स्ट्रिंग कार्यों के साथ आसान है:

with open('my_file.txt', 'rU') as in_file: 
    data = in_file.read().split('\n') 

कि मदों की एक सूची के रूप में अपनी डेटा फ़ाइल संग्रहीत करेगा , प्रति पंक्ति एक। फिर इसे एक फ़ाइल में डालने के लिए, आप विपरीत करेंगे:

with open('new_file.txt', 'w') as out_file: 
    out_file.write('\n'.join(data)) # This will create a string with all of the items in data separated by new-line characters 

उम्मीद है कि आप जो खोज रहे हैं उसे फिट बैठता है।

+0

+1। यदि 'डेटा' हम बात कर रहे हैं तो जटिल नहीं है, आईएमएचओ इस जवाब में अपने स्वयं के पार्सर को रोल करना बेहतर है। – brokenfoot

संबंधित मुद्दे