将数据从文件转换为结构化格式(python)

时间:2016-05-14 21:34:24

标签: python python-3.x parsing

我刚开始用Python编写小程序,所以我的经验水平非常低。目前我正在尝试将文件读入Python3中的数据结构,但我不知道如何快速地执行此操作。容易理解。

首先,我必须解释文件的内容。标题和以下行是属于标题的附加信息。

Booklist.txt

Programming----------------
Python Cookbook
Python in a nutshell
Recipes--------------------
Slow Cooking
Clean Eating
Low Carb
Sports---------------------
Mastering Mountain Bike Skills

我的想法是建立一个这样的结构:

{'Programming': ['Python Cookbook', 'Python in a nutshell'],
 'Recipes': ['Slow Cooking', 'Clean Eating', 'Low Carb'], ... }

到目前为止,我做了一些似乎有用的事情:

f = open('Booklist.txt')
myDict = dict()
for ind, line in enumerate(f):
    match = re.search(r"(^[\w ]+)([-]+)$", line)
    if match is not None:
        category = match.group(1)
        myDict[category] = []
    else:
        myDict[category].append(line)
f.close()

但是我可以用索引做什么?我可以用它以任何方式对键进行排序吗?字典是未分类的,对吗?

1 个答案:

答案 0 :(得分:0)

这可能有点过分,但您可以使用像parsimonious这样的python PEG解析器来解析booklist.txt。您需要花些时间来学习PEG语法,但使用已建立的库编写健壮的代码要比自己完成所有内容要容易得多。

基本用法:

from parsimonious.grammar import Grammar
grammar = Grammar(
  """
  body       = ( category '\n' name+ '\n' ) +
  category   =  name '-'+
  name       = ~"[a-zA-Z]*"i
  """)

with open('booklist.txt','r') as f:
  ast = grammar.parse(f.read())

print( ast )

SO更新问题后

是的,dict没有排序。如果要保留原始订单,请使用OrderedDict。此外,if match is not None:可以简化为if match: