2010-12-15 9 views
6

में डेटा को आसान सहेज/लोड करना पाइथन में डेटा को सहेजने और लोड करने का सबसे आसान तरीका क्या है, अधिमानतः मानव-पठनीय आउटपुट प्रारूप में?पाइथन

जो डेटा मैं सहेज रहा/लोड कर रहा हूं वह फ्लोट के दो वैक्टर होते हैं। आदर्श रूप में, इन वैक्टरों को फ़ाइल में नामित किया जाएगा (उदा। एक्स और वाई)।

मेरे वर्तमान save() और load() कार्यों file.readline(), file.write() और स्ट्रिंग करने वाली नाव रूपांतरण का उपयोग करें। कुछ बेहतर होना चाहिए।

उत्तर

5

कई विकल्प हैं - मुझे बिल्कुल नहीं पता कि आपको क्या पसंद है।दो वैक्टर एक ही लंबाई है, तो आप स्तंभ के रूप में, अपने वैक्टर को बचाने के लिए इस्तेमाल कर सकते हैं numpy.savetxt()x और y कहते हैं,:

# saving: 
f = open("data", "w") 
f.write("# x y\n")  # column names 
numpy.savetxt(f, numpy.array([x, y]).T) 
# loading: 
x, y = numpy.loadtxt("data", unpack=True) 

आप तैरता के बड़े वैक्टर के साथ काम कर रहे हैं, तो आप शायद NumPy वैसे भी उपयोग करना चाहिए।

+1

मुझे लगता है कि numpy.savetxt अपनी पहली तर्क के रूप में एक स्ट्रिंग लेता है। – nos

+0

@nos: यह फ़ाइल नाम या फ़ाइल ऑब्जेक्ट लेता है। हो सकता है कि न्यूमपी के पुराने संस्करणों ने केवल एक स्ट्रिंग स्वीकार कर ली हो। मैं पहले एक हेडर लाइन लिखने में सक्षम होने के लिए एक फ़ाइल ऑब्जेक्ट पास करता हूं। –

+0

अगर मैं f = open ("डेटा", "w +") – nos

2

एक सरल धारावाहिक प्रारूप जो मनुष्यों को कंप्यूटर पढ़ने के लिए आसान है JSON है।

आप json पायथन मॉड्यूल का उपयोग कर सकते हैं।

18

मानव-पठनीय आउटपुट प्राप्त करने का सबसे आसान तरीका एक जेएसओएन जैसे क्रमिकरण प्रारूप का उपयोग करना है। पायथन में json लाइब्रेरी है जिसका उपयोग आप स्ट्रिंग से डेटा को क्रमबद्ध करने के लिए कर सकते हैं। pickle की तरह, आप इसे एक आईओ ऑब्जेक्ट के साथ फ़ाइल में लिखने के लिए उपयोग कर सकते हैं।

import json 

file = open('/usr/data/application/json-dump.json', 'w+') 
data = { "x": 12153535.232321, "y": 35234531.232322 } 

json.dump(data, file) 

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

import json 
print json.dumps({ "x": 12153535.232321, "y": 35234531.232322 }) 

एक फ़ाइल से वापस पढ़ना बस के रूप में आसान है:

import json 

file = open('/usr/data/application/json-dump.json', 'r') 
print json.load(file) 

json पुस्तकालय पूर्ण विशेषताओं है, इसलिए मैं किस तरह देखने के लिए checking out the documentation की सलाह देते हैं चीजों के साथ आप इसके साथ कर सकते हैं।

7
  • यदि यह मानव पठनीय होना चाहिए, मैं भी JSON के साथ जाना चाहते हैं। जब तक आपको एंटरप्राइज़-प्रकार लोगों के साथ विनिमय करने की आवश्यकता नहीं है, तो वे XML को बेहतर पसंद करते हैं। :-)

  • यदि यह मानव संपादन योग्य और बहुत जटिल नहीं है हो सकता है, मैं शायद INI-जैसे प्रारूप, उदाहरण configparser के लिए की तरह किसी प्रकार का साथ जाना चाहते हैं।

  • यदि यह जटिल है, और करने के लिए बदला जा, मैं, बस डेटा नमकीन बनाना के साथ जाना चाहते हैं, जब तक यह बहुत जटिल, जिस स्थिति में मैं ZODB का उपयोग करेंगे की जरूरत नहीं है।

  • यदि यह बहुत अधिक डेटा है, और को आदान-प्रदान की आवश्यकता है, तो मैं SQL का उपयोग करूंगा।

यह बहुत अधिक कवर करता है, मुझे लगता है।

+1

क्या CSV इनमें से किसी भी आवश्यकता को फिट करता है? – dheerosaur

+0

सीएसवी एक अच्छा प्रारूप है यदि आपका डेटा बहुत सरल है (यानी टैब्यूलर), और आप इसे स्प्रेडशीट में आयात करने में सक्षम होना चाहते हैं। अन्यथा यह बहुत अपरिभाषित है, आसानी से पठनीय या संपादन योग्य नहीं है, जटिल डेटा को संभाल नहीं सकता है, और डेटासेट बड़ा होने पर दर्द होता है। –

0

चूंकि हम एक मानव संपादन फ़ाइल के बारे में बात कर रहे हैं, मुझे लगता है कि हम अपेक्षाकृत कम डेटा के बारे में बात कर रहे हैं।

निम्नलिखित कंकाल कार्यान्वयन के बारे में कैसे। यह डेटा को key=value जोड़े के रूप में सहेजता है और सूचियों, टुपल्स और कई अन्य चीजों के साथ काम करता है।

def save(fname, **kwargs): 
     f = open(fname, "wt") 
     for k, v in kwargs.items(): 
     print >>f, "%s=%s" % (k, repr(v)) 
     f.close() 

    def load(fname): 
     ret = {} 
     for line in open(fname, "rt"): 
     k, v = line.strip().split("=", 1) 
     ret[k] = eval(v) 
     return ret 

    x = [1, 2, 3] 
    y = [2.0, 1e15, -10.3] 
    save("data.txt", x=x, y=y) 
    d = load("data.txt") 
    print d["x"] 
    print d["y"] 
+0

मुझे eval चीज पसंद नहीं है, यह उपयोगकर्ता को मनमाने ढंग से कोड –

+0

निष्पादित करने की अनुमति देकर डस्टेन्ज चीजें ला सकता है, यह सरल सामग्री मानते हैं, ast.literal_eval उस दौर में हो जाता है। हालांकि, मैं जेसन दृष्टिकोण पसंद करता हूं। –

0

जैसा कि मैंने स्वीकार किए जाते हैं जवाब में टिप्पणी की, numpy यह एक सरल एक लाइनर के साथ किया जा सकता है का उपयोग करते हुए:

मान लिया जाये कि आप numpy के रूप में आयात किया है np (जो आम बात है),

np.savetxt('xy.txt', np.array([x, y]).T, fmt="%.3f", header="x y") 

(वैकल्पिक) प्रारूप में डेटा को बचाने और

x, y = np.loadtxt('xy.txt', unpack=True) 
होगा

इसे लोड करेगा।

फ़ाइल xy.txt तो लगेगा जैसे:

# x y 
1.000 1.000 
1.500 2.250 
2.000 4.000 
2.500 6.250 
3.000 9.000 

ध्यान दें कि प्रारूप स्ट्रिंग fmt=... वैकल्पिक है, लेकिन अगर लक्ष्य मानव पठनीयता है यह काफी उपयोगी साबित हो सकता। यदि उपयोग किया जाता है, तो यह सामान्य printf-जैसे कोड (मेरे उदाहरण में: 3 दशमलव के साथ फ़्लोटिंग-पॉइंट नंबर) का उपयोग करके निर्दिष्ट किया गया है।