2010-08-27 9 views
6

मैं पाइथन configparser मॉड्यूल के साथ एक आईएनआई फ़ाइल में कोई मूल्य के साथ टैग कैसे पार्स कर सकते हैं?ConfigParser के साथ कॉन्फ़िगरेशन फ़ाइलों में खाली मानों को कैसे प्रबंधित करें?

उदाहरण के लिए, मेरे पास निम्नलिखित ini है और मुझे आरबी पार्स करने की आवश्यकता है। कुछ आईएनआई फाइलों में आरबी में पूर्णांक मान होते हैं और कुछ उदाहरण पर नीचे दिए गए उदाहरण की तरह नहीं। मैं बिना किसी आतंक के कॉन्फ़िगरर के साथ ऐसा कैसे कर सकता हूं? मैं GetInt समारोह

[section] 
person=name 
id=000 
rb= 
+4

कृपया विराम चिह्न का उपयोग करें। – Seth

उत्तर

6

हो सकता है कि एक try...except ब्लॉक का उपयोग

import ConfigParser 

filename='config' 
parser=ConfigParser.SafeConfigParser() 
parser.read([filename]) 
print(parser.sections()) 
# ['section'] 
for section in parser.sections(): 
    print(parser.options(section)) 
    # ['id', 'rb', 'person'] 
    for option in parser.options(section): 
     try: 
      value=parser.getint(section,option) 
     except ValueError: 
      value=parser.get(section,option) 
     print(option,value,type(value)) 
     # ('id', 0, <type 'int'>) 
     # ('rb', '', <type 'str'>) 
     # ('person', 'name', <type 'str'>) 
print(parser.items('section')) 
# [('id', '000'), ('rb', ''), ('person', 'name')] 
+0

यह कॉन्फ़िगर पार्सर है .ऑप्शन मेरे पाइथन के संस्करण पर त्रुटि। –

11

का उपयोग करते समय आप पार्सर वस्तु बनाने allow_no_value=True वैकल्पिक तर्क सेट करना होगा।

try: 
     value=parser.getint(section,option) 
    except ValueError: 
     value=parser.get(section,option) 

उदाहरण के लिए::

+0

मैं config का उपयोग करने की कोशिश की = ConfigParser.ConfigParser (allow_no_value = सच) config.read (infFile) लेकिन मैं इस त्रुटि लेखन त्रुटि मिलती है: __init __() एक अप्रत्याशित कीवर्ड तर्क 'allow_no_value – AKM

+3

की तरह है कि [तर्क] लग रहा है मिल गया (http://docs.python.org/library/configparser.html#ConfigParser.RawConfigParser) केवल पायथन 2.7 में जोड़ा गया था। – Santa

+2

फिर सवाल यह है कि 2.6 के लिए ConfigParser के साथ खाली मान को कैसे संभालना है। – Exploring

3
इसके बजाय getint() का उपयोग करने का

, get() का उपयोग एक स्ट्रिंग के रूप विकल्प मिलता है। तो फिर अपने आप को पूर्णांक एक में बदलने का:

rb = parser.get("section", "rb") 
if rb: 
    rb = int(rb) 
0

के बाद से वहाँ अभी भी अजगर 2.6 के बारे में एक अनुत्तरित सवाल है, निम्नलिखित अजगर 2.7 या 2.6 के साथ काम करेंगे। यह कॉन्फ़िगरर्स में विकल्प, विभाजक, और मान को पार्स करने के लिए उपयोग किए जाने वाले आंतरिक रेगेक्स को प्रतिस्थापित करता है।

def rawConfigParserAllowNoValue(config): 
    '''This is a hack to support python 2.6. ConfigParser provides the 
    option allow_no_value=True to do this, but python 2.6 doesn't have it. 
    ''' 
    OPTCRE_NV = re.compile(
     r'(?P<option>[^:=\s][^:=]*)' # match "option" that doesn't start with white space 
     r'\s*'       # match optional white space 
     r'(?P<vi>(?:[:=]|\s*(?=$)))\s*' # match separator ("vi") (or white space if followed by end of string) 
     r'(?P<value>.*)$'    # match possibly empty "value" and end of string 
    ) 
    config.OPTCRE = OPTCRE_NV 
    config._optcre = OPTCRE_NV 
    return config 

के रूप में उपयोग

fp = open("myFile.conf") 
    config = ConfigParser.RawConfigParser() 
    config = rawConfigParserAllowNoValue(config) 

साइड नोट

अजगर 2.7 के लिए ConfigParser में एक OPTCRE_NV नहीं है, लेकिन अगर हम वास्तव में इसके बाद के संस्करण समारोह में इसका इस्तेमाल किया, regex कोई भी वापसी होगी vi और value के लिए, जो ConfigParser को आंतरिक रूप से विफल होने का कारण बनता है। ऊपर दिए गए फ़ंक्शन का उपयोग vi और value के लिए एक खाली स्ट्रिंग देता है और हर कोई खुश है।

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