سؤال

لدي مشكلة. يستخدم برنامجي ملف التكوين لتعيين الخيارات ، وأحد هذه الخيارات هو tuple. هذا ما أعنيه:

[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder[1]=/home/scorpil
folder[2]=/media/sda5/
folder[3]=/media/sdb5/

الخ ... هل يمكنني تحليل هذا في tuple مع وحدة configparser في بيثون؟ هل هناك طريقة سهلة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

إذا كنت تستطيع تغيير تنسيق التكوين مثل هذا:

folder = /home/scorpil
         /media/sda5/
         /media/sdb5/

ثم في بيثون:

config.get("common", "folder").split("\n")

نصائح أخرى

يمكن أن يكون التكوين الخاص بك:

[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder = ("/home/scorpil", "/media/sda5/", "/media/sdb5/")

على افتراض أن لديك تكوين في ملف يسمى foo.cfg ، يمكنك القيام بما يلي:

import ConfigParser
cp = ConfigParser.ConfigParser()
cp.read("foo.cfg")
folder = eval(cp.get("common", "folder"), {}, {})

print folder
print type(folder)

الذي يجب أن ينتج:

('/home/scorpil' ، '/media/sda5/' ، '/media/sdb5/')
u003Ctype 'tuple'>

- حتى مع وجود بيئة مقيدة ، إذا كان ملف التكوين تحت عنصر تحكم المستخدم ، فقد يكون فكرة سيئة للغاية. ربما أوصي اليوم بالقيام بشيء مثير للاهتمام مع Split لتجنب تنفيذ التعليمات البرمجية الضارة.

يمكنك الحصول على قائمة العناصر واستخدام فهم قائمة لإنشاء قائمة بجميع العناصر التي يبدأ الاسم ببادئة محددة ، في حالتك مجلد

folders = tuple([ item[1] for item in configparser.items() if item[0].startswith("folder")])

إنشاء التكوين:

folders = ['/home/scorpil', '/media/sda5/', '/media/sdb5/']
config.set('common', 'folders', json.dumps(folders))

تكوين التحميل:

tuple(json.loads(config.get('common', 'folders')))

لا أعرف conflipparser ، ولكن يمكنك قراءتها بسهولة في قائمة (ربما باستخدام .append()) ثم افعل myTuple = tuple(myList)

#!/usr/bin/env python
sample = """
[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder[1]=/home/scorpil
folder[2]=/media/sda5/
folder[3]=/media/sdb5/
"""
from cStringIO import StringIO
import ConfigParser
import re
FOLDER_MATCH = re.compile(r"folder\[(\d+)\]$").match

def read_list(items,pmatch=FOLDER_MATCH):
    if not hasattr(pmatch,"__call__"):
        pmatch = re.compile(pmatch).match
    folder_list = []
    for k,v in items:
        m = pmatch(k)
        if m:
            folder_list.append((int(m.group(1)),v))
    return tuple( kv[1] for kv in sorted(folder_list) )


if __name__ == '__main__':
    cp = ConfigParser.SafeConfigParser()
    cp.readfp(StringIO(sample),"sample")

    print read_list(cp.items("common"))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top