簡體   English   中英

在Python中解析鍵值對

[英]Parse Key Value Pairs in Python

所以我有一個類似於JSON格式的鍵值文件,但它與Python JSON解析器不相同。

例:

"Matt"
{
    "Location"    "New York"
    "Age"         "22"
    "Items"
    {
        "Banana"    "2"
        "Apple"     "5"
        "Cat"       "1"
    }
}

有沒有簡單的方法來解析這個文本文件並將值存儲到一個數組中,以便我可以使用類似於Matt [Items] [Banana]的格式訪問數據? 每條線只有一對,一個支架應該表示下降一個水平並上升一個水平。

您可以使用re.sub來“修復”您的字符串,然后解析它。 只要格式始終是單個帶引號的字符串或每行上的一對帶引號的字符串,您就可以使用它來確定逗號和冒號的放置位置。

import re
s = """"Matt"
{
    "Location"    "New York"
    "Age"         "22"
    "Items"
    {
        "Banana"    "2"
        "Apple"     "5"
        "Cat"       "1"
    }
}"""

# Put a colon after the first string in every line
s1 = re.sub(r'^\s*(".+?")', r'\1:', s, flags=re.MULTILINE)
# add a comma if the last non-whitespace character in a line is " or }
s2 = re.sub(r'(["}])\s*$', r'\1,', s1, flags=re.MULTILINE)

完成后,您可以使用ast.literal_eval將其轉換為Python字典。 我通過JSON解析使用它,因為它允許使用尾隨逗號,沒有這些逗號,將逗號放在哪里的決定變得更加復雜:

import ast
data = ast.literal_eval('{' + s2 + '}')
print data['Matt']['Items']['Banana']
# 2

不確定這種方法在您發布的示例之外是多么強大,但它確實支持轉義字符和更深層次的結構化數據。 對於大量數據來說,它可能不夠快。

該方法使用(非常)簡單的解析器將您的自定義數據格式轉換為JSON,以添加所需的冒號和大括號,然后可以將JSON數據轉換為本機Python字典。

import json

# Define the data that needs to be parsed
data = '''
"Matt"
{
    "Location"    "New \\"York"
    "Age"         "22"
    "Items"
    {
        "Banana"    "2"
        "Apple"     "5"
        "Cat"
        {
            "foo"   "bar"
        }
    }
}
'''

# Convert the data from custom format to JSON
json_data = ''

# Define parser states
state = 'OUT'
key_or_value = 'KEY'

for c in data:
    # Handle quote characters
    if c == '"':
        json_data += c

        if state == 'IN':
            state = 'OUT'
            if key_or_value == 'KEY':
                key_or_value = 'VALUE'
                json_data += ':'

            elif key_or_value == 'VALUE':
                key_or_value = 'KEY'
                json_data += ','

        else:
            state = 'IN'

    # Handle braces
    elif c == '{':
        if state == 'OUT':
            key_or_value = 'KEY'
        json_data += c

    elif c == '}':
        # Strip trailing comma and add closing brace and comma
        json_data = json_data.rstrip().rstrip(',') + '},'

    # Handle escaped characters
    elif c == '\\':
        state = 'ESCAPED'
        json_data += c

    else:
        json_data += c

# Strip trailing comma
json_data = json_data.rstrip().rstrip(',')

# Wrap the data in braces to form a dictionary
json_data = '{' + json_data + '}'

# Convert from JSON to the native Python
converted_data = json.loads(json_data)

print(converted_data['Matt']['Items']['Banana'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM