我在一个文件中读入了一系列字典,但它们没有使用双引号正确格式化。下面的例子中展示了未正确格式化的字典格式:
{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()
运行以上代码即可将数据从文件中读入并转换成字典列表。