2009-08-21 10 views
8

के बीच मान ConfigParser मॉड्यूल का उपयोग करते समय मैं cfg फ़ाइल में सेट किए गए एकाधिक शब्दों वाले मानों का उपयोग करना चाहता हूं। इस मामले में तुच्छ लगता है मेरे जैसे उद्धरण के साथ स्ट्रिंग (example.cfg) के चारों ओर के लिए:पायथन कॉन्फ़िगरर्स - उद्धरण

[GENERAL] 
onekey = "value in some words" 

मेरे समस्या यह है कि इस मामले में अजगर स्ट्रिंग के लिए उद्धरण संलग्न कर देता है और साथ ही जब इस तरह मान का उपयोग कर रहा है:

config = ConfigParser() 
config.read(["example.cfg"]) 
print config.get('GENERAL', 'onekey') 

मुझे यकीन है कि '"value in some words"' के बजाय केवल 'value in some words' मुद्रित करने के लिए एक अंतर्निर्मित सुविधा है। यह कैसे संभव है? धन्यवाद।

उत्तर

9

मुझे the configparser manual में कुछ भी दिखाई नहीं मिला, लेकिन आप अग्रणी और पीछे वाले डबल कोट्स से छुटकारा पाने के लिए स्ट्रिंग्स की .strip विधि का उपयोग कर सकते हैं।

>>> s = '"hello world"' 
>>> s 
'"hello world"' 
>>> s.strip('"') 
'hello world' 
>>> s2 = "foo" 
>>> s2.strip('"') 
'foo' 

आप देख सकते हैं, .strip स्ट्रिंग संशोधित नहीं करता है अगर यह शुरू नहीं करता है और निर्दिष्ट स्ट्रिंग के साथ समाप्त।

+0

नोट अंतिम वाक्य अद्यतन किया जाना चाहिए। 'स्ट्रिप()' स्ट्रिंग को संशोधित करता है यदि यह प्रारंभ होता है या निर्दिष्ट स्ट्रिंग के साथ समाप्त होता है। जैसे ''' bar'.strip (" '")' रिटर्न '' बार 'और' बार 'नहीं। – Jonny

2

क्षमा करें, समाधान भी छोटा था - मैं बस उद्धरण छोड़ सकता हूं, ऐसा लगता है कि पाइथन बस बराबर चिह्न के दाहिने तरफ लेता है।

0

डेवी,

तुम कहो तो आप बस अपने स्ट्रिंग बंद उद्धरण छोड़ सकते हैं।

एक परियोजना के लिए मैं काम कर रहा हूं, मैं अपने कुछ कॉन्फ़िगरेशन विकल्पों के लिए मूल्य के रूप में लगभग किसी भी पायथन स्ट्रिंग का प्रतिनिधित्व करने में सक्षम होना चाहता था और उस बिंदु पर और अधिक मैं कच्चे के रूप में उनमें से कुछ को संभालने में सक्षम होना चाहता था स्ट्रिंग अक्षर। (मैं चाहता हूं कि कॉन्फ़िगरेशन \ n, \ x1b, और इसी तरह की चीजों को संभालने में सक्षम हो)।

def EvalStr(s, raw=False): 
    r'''Attempt to evaluate a value as a Python string literal or 
     return s unchanged. 

     Attempts are made to wrap the value in one, then the 
     form of triple quote. If the target contains both forms 
     of triple quote, we'll just punt and return the original 
     argument unmodified. 

     Examples: (But note that this docstring is raw!) 
     >>> EvalStr(r'this\t is a test\n and only a \x5c test') 
     'this\t is a test\n and only a \\ test' 

     >>> EvalStr(r'this\t is a test\n and only a \x5c test', 'raw') 
     'this\\t is a test\\n and only a \\x5c test' 
    ''' 

    results = s ## Default returns s unchanged 
    if raw: 
     tmplate1 = 'r"""%s"""' 
     tmplate2 = "r'''%s'''" 
    else: 
     tmplate1 = '"""%s"""' 
     tmplate2 = "'''%s'''" 

    try: 
     results = eval(tmplate1 % s) 
    except SyntaxError: 
    try: 
     results = eval(tmplate2 %s) 
    except SyntaxError: 
     pass 
    return results 

... जो मुझे लगता है कि कुछ भी है कि दोनों ट्रिपल एकल और ट्रिपल डबल उद्धृत तार शामिल नहीं है संभाल लेंगे:

उस मामले में मैं कुछ इस तरह इस्तेमाल किया।

(वह एक कोने का मामला मेरी आवश्यकताओं से परे है)।

एसओ पर इस कोड की एक विषमता है; सिंटेक्स हाइलाइटर द्वारा भ्रमित प्रतीत होता है तथ्य यह है कि मेरा डॉकस्ट्रिंग कच्चे स्ट्रिंग है। इस विशेष समारोह के लिए सबसे अच्छा काम करना आवश्यक था)।

5
import ConfigParser 

class MyConfigParser(ConfigParser.RawConfigParser): 
    def get(self, section, option): 
     val = ConfigParser.RawConfigParser.get(self, section, option) 
     return val.strip('"') 

if __name__ == "__main__": 
    #config = ConfigParser.RawConfigParser() 
    config = MyConfigParser() 

    config.read(["example.cfg"]) 
    print config.get('GENERAL', 'onekey') 
2

प्रश्न पहले से ही काफी पुराना है, लेकिन 2.6 में कम से कम आपको उद्धरणों का उपयोग करने की आवश्यकता नहीं है क्योंकि रिक्त स्थान बनाए रखा जाता है।

from ConfigParser import RawConfigParser 
from StringIO import StringIO 

s = RawConfigParser() 
s.readfp(StringIO('[t]\na= 1 2 3')) 
s.get('t','a') 
> '1 2 3' 

हालांकि यह या तो अग्रणी या पिछली जगहों पर लागू नहीं होता है! यदि आप उन्हें बनाए रखना चाहते हैं, तो आपको सुझावों के अनुसार आगे बढ़ने की आवश्यकता होगी। eval कीवर्ड का उपयोग करने से बचें क्योंकि आपके पास एक विशाल सुरक्षा छेद होगा।

-2

इस स्थिति में, सबसे सरल समाधान "eval()" है।

हालांकि, आप सुरक्षा सामग्री के बारे में चिंता कर सकते हैं।एक नमूना के रूप में

def literal_eval(node_or_string): 
    """ 
    Safely evaluate an expression node or a string containing a Python 
    expression. The string or node provided may only consist of the following 
    Python literal structures: strings, numbers, tuples, lists, dicts,booleans, 
    and None. 
    """ 

:: लेकिन आप अभी भी इस से कर सकता है

import ast 
config = ConfigParser() 
config.read(["example.cfg"]) 
print ast.literal_eval(config.get('GENERAL', 'onekey')) 
# value in some words 
संबंधित मुद्दे