2

構成ファイルからさまざまなデータ型を取得し、それらを辞書に追加しています。しかし、リストに問題があります。alist = [1,2,3,4,5,6,7]text: を含む行を取り、整数のリストに変換したいと思います。しかし、私は得ています

['1', ',', '2', ',', '3', ',', '4', ',', '5', ',', '6', ',', '7'].  

どうすればこれを修正できますか?

ここにconfig.txtがあります:

firstname="Joe"
lastname="Bloggs"
employeeId=715
type="ios"
push-token="12345"
time-stamp="Mon, 22 Jul 2013 18:45:58 GMT"
api-version="1" 
phone="1010"
level=7
mylist=[1,2,3,4,5,6,7]

解析するコードは次のとおりです。

mapper = {}

def massage_type(s):
    if s.startswith('"'):
        return s[1:-1]
    elif s.startswith('['):
        return list(s[1:-1])   #in this case get 'mylist': ['1', ',', '2', ',', '3', ',', '4', ',', '5', ',', '6', ',', '7']
    elif s.startswith('{'):
        return "object"   #todo
    else:
        return int(s)



doc = open('config.txt')
for line in doc:
    line = line.strip()
    tokens = line.split('=')
    if len(tokens) == 2:
        formatted = massage_type(tokens[1])
        mapper[tokens[0]] = formatted

    #check integer list
    mapper["properlist"] = [1,2,3,4,5,6,7]  #this one works

print mapper

ここに私の印刷出力があります:

{'time-stamp': 'Mon, 22 Jul 2013 18:45:58 GMT', 'mylist': ['1', ',', '2', ',', '3', ',', '4', ',', '5', ',', '6', ',', '7'], 'employeeId': 715, 'firstname': 'Joe', 'level': 7, 'properlist': [1, 2, 3, 4, 5, 6, 7], 'lastname': 'Bloggs', 'phone': '1010', 'push-token': '12345', 'api-version': '1', 'type': 'ios'}

アップデート。

フィードバックをお寄せいただきありがとうございます。異種リストも取得できることに気付いたので、リスト部分を次のように変更しました。

elif s.startswith('['):
    #check element type
    elements = s[1:-1].split(',')
    tmplist = []           #assemble temp list
    for elem in elements:
        if elem.startswith('"'):
            tmplist.append(elem[1:-1])
        else:
            tmplist.append(int(elem))

    return tmplist

文字列と整数のみを処理しますが、今必要なものには十分です。

4

7 に答える 7

1

ConfigParser の使用を検討することもできます (以下の Python 3 の例、Python 2 の importsConfigParser.ConfigParserだと思います):

from configparser import ConfigParser

parser = ConfigParser()
conf_file = os.path.join(dir_it's_located_in, 'config.txt')
parser.read(conf_file)

その後は、本当に基本的なことです: 構成ファイル全体が辞書オブジェクトのように扱われ、すべての構成行が辞書のキーになります。

firstname = parser['firstname']
lastname = parser['lastname']

次のように、構成にセクションを設定することもできます。

[employee info]
email = "something@something.com"
birthday = 10/12/98

そして、これらを次の方法で参照できます。

birthday = parser["employee info"]["birthday"]

そして、いつものように、ドキュメントには素晴らしい例がいくつかあります: http://docs.python.org/3.2/library/configparser.html

于 2013-07-22T18:36:03.997 に答える
0

@erewokが言及したように、ConfigParserを使用するというアイデアが好きです。ここに「パーサー」全体があります

def parse(content):

    def parseList(content):
        # Recursive strategy
        listed = content.strip("[]").split(",")
        return map(parse, listed)

    def parseString(content):
        return content.strip("\"")

    def parseNumber(content):
        return int(content)

    def parse(content):
        if (content.startswith("\"")):
            return parseString(content)
        elif (content.startswith("[")):
            return parseList(content)
        elif (content.isdigit()):
            return parseNumber(content)

    # Create dictionary with values
    result = {}

    for line in content.splitlines():
        key, value = line.split("=",1)
        result[key] = parse(value)

    return result

リストに数字と文字列が混在している場合に備えて、取得しているリスト内の要素をサブパースするために再帰戦略を使用しています

于 2013-07-22T18:49:20.787 に答える