2011-08-04 8 views
11

पर्ल मुझे डेटा ब्लॉक की शुरुआत को चिह्नित करने के लिए __DATA__ टोकन का उपयोग करने की अनुमति देता है। मैं डेटा फ़ाइलhandle का उपयोग कर डेटा पढ़ सकते हैं। एक स्क्रिप्ट में डेटा ब्लॉक स्टोर करने के लिए पाइथोनिक तरीका क्या है?पाइथन लिपि में डेटा ब्लॉक स्टोर करने का पाइथोनिक तरीका क्या है?

+2

इसे एक अलग फ़ाइल (मॉड्यूल) में रखें और इसे आयात करें। इनलाइन मत करो। – agf

+1

@agf - मैं असहमत हूं। स्ट्रिंगियो में लिपटे एक तिहाई-उद्धृत स्ट्रिंग का उपयोग करके फ़ाइल जैसी ऑब्जेक्ट को रेखांकित करना एक पोर्टेबल और स्वयं निहित परीक्षण केस या डेमो स्क्रिप्ट के लिए बनाता है। – PaulMcG

+0

धन्यवाद! Stackoverflow समुदाय अद्भुत है! –

उत्तर

8

यह आपके डेटा पर निर्भर करता है, लेकिन dict literalals और multi-line स्ट्रिंग्स वास्तव में दोनों अच्छे तरीके हैं।

from StringIO import StringIO 

textdata = """\ 
Now is the winter of our discontent, 
Made glorious summer by this sun of York. 
""" 

# in place of __DATA__ = open('richard3.txt') 
__DATA__ = StringIO(textdata) 
for d in __DATA__: 
    print d 

__DATA__.seek(0) 
print __DATA__.readline() 

प्रिंटों:

state_abbr = { 
    'MA': 'Massachusetts', 
    'MI': 'Michigan', 
    'MS': 'Mississippi', 
    'MN': 'Minnesota', 
    'MO': 'Missouri', 
    } 

gettysburg = """ 
Four score and seven years ago, 
our fathers brought forth on this continent 
a new nation, 
conceived in liberty 
and dedicated to the proposition 
that all men are created equal. 
""" 
+2

यदि यह बाइनरी डेटा (यानी कोई बाइट्स और कोई टेक्स्ट नहीं है) तो आप बी के साथ स्ट्रिंग को उपसर्ग करके भी शामिल कर सकते हैं। Ie: बी "\ x00 \ x01 \ x16 \ x38"। इसका उपयोग क्यूटी द्वारा संसाधन फ़ाइलों को शामिल करने के लिए किया जाता है उदाहरण के लिए – Voo

+4

@Voo: बी उपसर्ग ऐसा नहीं करता है। इसे पायथन 2 में अनदेखा किया गया है, और पायथन 3 में स्ट्रिंग (यूनिकोड) शाब्दिक के बजाय बाइट्स शाब्दिक बनाने का मतलब है। बाइनरी डेटा को शामिल किया जा सकता है क्योंकि हेक्स एक नियमित अन-प्रीफिक्स्ड स्ट्रिंग में बस ठीक है। –

+0

ओह ठीक है, पायथन 3 मोड में था। निश्चित रूप से पाइथन 2 में "स्ट्रिंग्स" उपसर्ग के साथ शुरू करने के लिए यूनिकोड नहीं हैं, इससे ज्यादा समझ नहीं आएगी। लेकिन क्या आपको वास्तव में एक पायथन 3 स्ट्रिंग में अवैध यूनिकोड कोडपॉइंट्स शामिल करने की अनुमति है? यह आश्चर्यजनक है, खासकर जब बाइट्स से रूपांतरण (जैसे सॉकेट से पढ़ा जाता है) यूनिकोड में वास्तव में जांच करता है कि यह समझ में आता है या नहीं। – Voo

4

एक में स्रोत फ़ाइल की तरह वस्तु बनाने के लिए StringIO मॉड्यूल का उपयोग करें

Now is the winter of our discontent, 

Made glorious summer by this sun of York. 

Now is the winter of our discontent, 

(मैं तो बस इस __DATA__ कहा जाता है अपने मूल प्रश्न से तालमेल अभ्यास में, यह अच्छा पायथन नामकरण शैली नहीं होगी - datafile जैसे कुछ अधिक उपयुक्त होंगे।)

+4

मानक जादू विधियों के अलावा कुछ भी के लिए डबल अंडरस्कोर नामों का उपयोग न करें। – agf

0

पर्ल के __DATA__ परिवर्तनीय Google से परिचित नहीं है Google मुझे बता रहा है कि इसे अक्सर परीक्षण के लिए उपयोग किया जाता है। मान लें कि आप अपने कोड का परीक्षण करने की भी तलाश कर रहे हैं, आप सबसे अच्छे (http://docs.python.org/library/doctest.html) पर विचार करना चाहेंगे। उदाहरण के लिए,

import StringIO 

__DATA__ = StringIO.StringIO("""lines 
of data 
from a file 
""") 

मान लिया जाये कि आप आंकड़े चाहता था एक फ़ाइल वस्तु है कि अब आप क्या मिल गया है और आप सबसे अधिक अन्य फ़ाइल वस्तुओं आगे जाने की तरह उपयोग कर सकते हैं होने के लिए के बजाय के लिए। उदाहरण के लिए:

if __name__=="__main__": 
    # test myfunc with test data: 
    lines = __DATA__.readlines() 
    myfunc(lines) 

लेकिन अगर आंकड़े का केवल उपयोग के परीक्षण के लिए है तो आप शायद एक doctest बनाने या PyUnit/नाक में एक टेस्ट केस लेखन से बेहतर कर रहे हैं।

उदाहरण के लिए

:

import StringIO 

def myfunc(lines): 
    r"""Do something to each line 

    Here's an example: 

    >>> data = StringIO.StringIO("line 1\nline 2\n") 
    >>> myfunc(data) 
    ['1', '2'] 
    """ 
    return [line[-2] for line in lines] 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

इस तरह उन परीक्षण चल रहा है:

$ python ~/doctest_example.py -v 
Trying: 
    data = StringIO.StringIO("line 1\nline 2\n") 
Expecting nothing 
ok 
Trying: 
    myfunc(data) 
Expecting: 
    ['1', '2'] 
ok 
1 items had no tests: 
    __main__ 
1 items passed all tests: 
    2 tests in __main__.myfunc 
2 tests in 2 items. 
2 passed and 0 failed. 
Test passed. 

Doctest सादा पाठ फ़ाइलों में अजगर परीक्षण खोजने और उन्हें चलने सहित विभिन्न चीजों की एक बहुत कुछ करता है। निजी तौर पर, मैं एक बड़ा प्रशंसक नहीं हूं और अधिक संरचित परीक्षण दृष्टिकोण (import unittest) पसंद करता हूं लेकिन यह स्पष्ट रूप से कोड कोड का परीक्षण करने के लिए एक पाइथोनिक तरीका है।

0

आईएमओ यह डेटा के प्रकार पर निर्भर करता है: यदि आपके पास केवल टेक्स्ट है और यह सुनिश्चित हो सकता है कि कोई भी मौका नहीं है, तो आप "" या "" "नहीं हैं, तो आप इस संग्रह का उपयोग करने के इस संस्करण का उपयोग कर सकते हैं पाठ। लेकिन यदि आप चाहते हैं तो क्या करना है, उदाहरण के लिए, कुछ टेक्स्ट स्टोर करें जहां यह ज्ञात है कि '' 'या "" "वहां मौजूद है या हो सकता है? तो फिर यह

  • या तो करने के लिए adviseable है डेटा किसी भी तरह से कोडित या स्टोर
  • एक अलग फाइल में रख

उदाहरण: पाठ है

वहाँ कई हैं ' पायथन पुस्तकालयों में और "" "है।

इस मामले में, इसे ट्रिपल कोट के माध्यम से करना मुश्किल हो सकता है। तो आप

__DATA__ = """There are many '''s and \"""s in Python libraries."""; 
print __DATA__ 

लेकिन टेक्स्ट संपादित करने या बदलने के दौरान आपको ध्यान देना होगा। इस मामले में, यह

$ python -c 'import sys; print sys.stdin.read().encode("base64")' 
There are many '''s and """s in Python libraries.<press Ctrl-D twice> 

करने के लिए और अधिक उपयोगी हो सकता है तो आप

VGhlcmUgYXJlIG1hbnkgJycncyBhbmQgIiIicyBpbiBQeXRob24gbGlicmFyaWVzLg== 
आउटपुट के रूप में

मिलता है। इसे लें और इसे अपनी स्क्रिप्ट में रखें, जैसे

__DATA__ = 'VGhlcmUgYXJlIG1hbnkgJycncyBhbmQgIiIicyBpbiBQeXRob24gbGlicmFyaWVzLg=='.decode('base64') 
print __DATA__ 

और परिणाम देखें।

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