使用Python处理不当格式化的字典文件

133 阅读2分钟

我在一个文件中读入了一系列字典,但它们没有使用双引号正确格式化。下面的例子中展示了未正确格式化的字典格式:

huake_00183_.jpg

{game:Available,player:Available,location:"Chelsea, London, England",time:Available}
{"game":"Available","player":"Available","location":"Chelsea, London, England","time":"Available","date":"Available"}

从示例可以看出,键和值之间没有用引号括起来,不同字典中的键也不相同。

2. 解决方案

我尝试了多种方法来解决这个问题,包括使用json模块、csv模块的DictReader、自定义函数等。但我仍然遇到问题,主要原因是字典中总是含有关键字location, 值中总有值是一个地址,因此需要保留字段中的引号。

0. 安装库

在使用代码前,我们需要安装以下依赖库:

pip install pyparsing

1. 将逗号","替换为分号;,去除引号

def replace_and_remove_quotes(line):
    # 替换逗号为分号
    line = line.replace(",", ";")
    # 去除引号
    line = line.replace('"', '')
    line = line.replace("'", "")
    return line

2. 将分号和空格分割,生成字典

def get_dict(line):
    # 按分号和空格分割
    parts = line.split("; ")
    # 创建字典
    result = {}
    for part in parts:
        key, value = part.split(":")
        # 去除值两端的空格
        value = value.strip()
        # 将键值对添加到字典
        result[key] = value
    return result

3. 使用pyparsing自定义解析函数

import pyparsing as pp
# 定义基本解析单元
key = pp.Word(pp.alphas + "_")
value = pp.QuotedString('"') | pp.Word(pp.printables).setResultsName('unquoted_value')
# 定义字典解析表达式
dict_expr = pp.Group(
    "{"
    + pp.ZeroOrMore(
        (key + "=" + value).setResultsName("key_value_pair")
    )
    + "}"
)
# 解析字符串
def parse_dict(line):
    try:
        result = dict_expr.parseString(line)
        return {pair.key_value_pair[0]: pair.key_value_pair[1] for pair in result.key_value_pair}
    except pp.ParseException:
        return None

4. 完整示例代码

import pyparsing as pp

# 定义基本解析单元
key = pp.Word(pp.alphas + "_")
value = pp.QuotedString('"') | pp.Word(pp.printables).setResultsName('unquoted_value')
# 定义字典解析表达式
dict_expr = pp.Group(
    "{"
    + pp.ZeroOrMore(
        (key + "=" + value).setResultsName("key_value_pair")
    )
    + "}"
)

def parse_dict(line):
    try:
        result = dict_expr.parseString(line)
        return {pair.key_value_pair[0]: pair.key_value_pair[1] for pair in result.key_value_pair}
    except pp.ParseException:
        return None

def main():
    # 读取文件内容
    with open('input.txt', 'r') as f:
        lines = f.readlines()

    # 使用pyparsing解析每行
    dicts = []
    for line in lines:
        result = parse_dict(line)
        if result:
            dicts.append(result)

    # 打印结果
    for d in dicts:
        print(d)

if __name__ == '__main__':
    main()

运行以上代码即可将数据从文件中读入并转换成字典列表。