2010-02-11 7 views
10

मैं एक छोटे से डीबी टेस्ट स्वीट, जिन तक प्रश्नों के साथ विन्यास फाइल पढ़ता लिख ​​रहा हूँ और अपेक्षित परिणाम प्रति कई पंक्तियों के साथ विन्यास फाइल, उदा .: पढ़ेंपायथन: कुंजी

query   = "SELECT * from cities WHERE name='Unknown';" 
count   = 0 
level   = 1 
name   = "Check for cities whose name should be null" 
suggested_fix = "UPDATE cities SET name=NULL WHERE name='Unknown';" 

यह अच्छी तरह से काम करता है; मैं पाइथन के string.partition('=') का उपयोग करके प्रत्येक पंक्ति को विभाजित करता हूं।

मेरी समस्या बहुत लंबे समय तक SQL प्रश्न हैं। वर्तमान में, मैं इन प्रश्नों को एक लाइनर के रूप में पेस्ट करता हूं, जो बदसूरत और अस्पष्ट है।

मैं अभिव्यक्ति के अधिकार को पढ़ने के लिए एक सुरुचिपूर्ण, पाइथोनिक तरीका खोजना चाहता हूं, भले ही कई लाइनों पर फैला हुआ हो।

नोट्स:

  • मेरी एसक्यूएल प्रश्नों =
  • शामिल हो सकता है मैं वहाँ इसके बिना कई मौजूदा फ़ाइलें हैं क्योंकि, दाहिने हाथ की ओर चारों ओर " रों लिए मजबूर करने के विचार पसंद नहीं करते हैं।

संपादित करें:

ConfigParser महान है, लेकिन यह मेरे लिए एक बहु प्रवेश में हर पंक्ति के आरंभ में एक रिक्ति या टैब जोड़ने के लिए बाध्य करती है। यह एक बड़ा दर्द हो सकता है।

अग्रिम धन्यवाद,

एडम

+0

इस स्थान/टैब अंतिम मूल्य – SilentGhost

+0

आप विस्तार से बता सकते हैं में शामिल नहीं है? आपकी टिप्पणी समझ में नहीं आया। –

उत्तर

9

यह लगभग ठीक यूज-केस कि हमें YAML करने के लिए स्विच कर दिया है (Wikipedia, python implementation, documentation, तुम एक विकल्प के रूप JSON को देखने के लिए चाहते हो सकता है)।YAML configparser या json पर कुछ लाभ हैं:

  • मानव पठनीयता (बड़ी फ़ाइलों के लिए JSON की तुलना में बेहतर);
  • मनमाने ढंग से पायथन ऑब्जेक्ट्स को क्रमबद्ध कर सकता है (जो इसे pickle के रूप में अन-सुरक्षित बनाता है, लेकिन इस समस्या को कम करने के लिए पाइथन कार्यान्वयन में safe_load फ़ंक्शन है)। यह पहले से ही datetime ऑब्जेक्ट के रूप में सरल कुछ के लिए उपयोगी है।

पूर्णता के लिए, मुख्य नुकसान (IMO):

    परिमाण JSON कार्यान्वयन की तुलना में धीमी की एक आदेश द्वारा
  • अजगर कार्यान्वयन;
  • जेएसओएन की तुलना में प्लेटफॉर्म पर कम पोर्टेबल।

उदाहरण के लिए

import yaml 

sql = """ 
query   : "SELECT * from cities 
WHERE name='Unknown';" 
count   : 0 
level   : 1 
name   : "Check for cities whose name should be null" 
suggested_fix : "UPDATE cities SET name=NULL WHERE name='Unknown';" 
""" 

sql_dict = yaml.safe_load(sql) 

print(sql_dict['query']) 

प्रिंट

SELECT * from cities WHERE name='Unknown'; 
+0

+1: इस तरह के कॉन्फ़िगरेशन के लिए yaml बहुत अच्छा है – van

+0

+1 ग्रेट विचार। इसमें देखेंगे। –

+0

+1 उपयोग केस को खूबसूरती से फिट करता है। –

12

अजगर मानक पुस्तकालय मॉड्यूल ConfigParser डिफ़ॉल्ट रूप से इस का समर्थन करता है।

[Long Section] 
short: this is a normal line 
long: this value continues 
in the next line 

विन्यास फाइल ऊपर निम्न कोड के साथ पढ़ा जा सकता है: विन्यास फाइल एक मानक प्रारूप में हो गया है मैं तुम्हें रेगुलर एक्सप्रेशन का उपयोग करने के लिए सुझाव है कि

import ConfigParser 
config = ConfigParser.ConfigParser() 
config.read('longsections.cfg') 
long = config.get('Long Section', 'long') 
+1

मुझे इस समाधान के साथ कोई समस्या है क्योंकि फ़ाइल को पार्स करने पर त्रुटियां उठाई जाती हैं। दस्तावेज़ीकरण के अनुसार, multiline मान इंडेंटेशन के लिए आवश्यक है। मैंने "अगली पंक्ति में" की शुरुआत में 4 रिक्त स्थान जोड़े और यह काम करता है। – MikeCPT

1

... कोड इस प्रकार दिखाई देंगे देने के लिए आप शुरू कर रहे हैं:

import re 

test="""query = "select * from cities;" 
count = 0 
multine_query = "select * 
from cities 
    where name='unknown';" 
""" 

re_config = re.compile(r'^(\w+)\s*=\s*((?:".[^"]*")|(?:\d+))$', re.M) 
for key, value in re_config.findall(test): 
    if value.startswith('"'): 
     value = value[1:-1] 
    else: 
     value = int(value) 
    print key, '=', repr(value) 

इस उदाहरण के उत्पादन में है:

~> python test.py 
query = 'select * from cities;' 
count = 0 
multine_query = "select *\nfrom cities\n  where name='unknown';" 

आशा है कि मदद करता है!

सादर, क्रिस्टोफ

+1

+1 यह काम करना चाहिए, लेकिन मैं वास्तव में तैयार किए गए पैकेज को पसंद करता हूं जो सभी प्रकार की एज स्थितियों का समर्थन करता है। –