我有一个大文本文件,结构如下:
Student = {
PInfo = {
ID = 0001;
Name.First = "Joe";
Name.Last = "Burger";
DOB = "01/01/2000";
};
School = "West High";
Address = {
Str1 = "001 Main St.";
Zip = 12345;
};
};
Student = {
PInfo = {
ID = 0002;
Name.First = "John";
Name.Last = "Smith";
DOB = "02/02/2002";
};
School = "East High";
Address = {
Str1 = "001 40nd St.";
Zip = 12346;
};
Club = "Football";
};
....
Student block 共享相同的条目,如“PInfo”、“School”和“Address”,但其中一些可能有其他条目,例如“John Smith”的“Club”信息不包含在“乔·伯格”。 我想做的是获取每个学生的姓名、学校名称和邮政编码并将它们存储在字典中,例如
{'Joe Burger':{School:'West High', Zip:12345}, 'John Smith':{School:'East High', Zip:12346}, ...}
初学python编程,试着打开文件逐行分析,但是看起来好麻烦。并且真实文件比我上面发布的示例更大更复杂。我想知道是否有更简单的方法来做到这一点。先谢谢了。
最佳答案
要解析文件,您可以定义描述输入格式的语法并使用它来生成解析器。
有many language parsers in Python .例如,您可以使用 Grako它采用 EBNF 变体中的语法作为输入,输出内存 PEG Python 中的解析器。
要安装 Grako,请运行 pip install grako
。
这是使用 Grako 风格的 EBNF 语法的格式语法:
(* a file is zero or more records *)
file = { record }* $;
record = name '=' value ';' ;
name = /[A-Z][a-zA-Z0-9.]*/ ;
value = object | integer | string ;
(* an object contains one or more records *)
object = '{' { record }+ '}' ;
integer = /[0-9]+/ ;
string = '"' /[^"]*/ '"';
要生成解析器,将语法保存到文件中,例如 Structured.ebnf
并运行:
$ grako -o structured_parser.py Structured.ebnf
它创建可用于从输入中提取学生信息的structured_parser
模块:
#!/usr/bin/env python
from structured_parser import StructuredParser
class Semantics(object):
def record(self, ast):
# record = name '=' value ';' ;
# value = object | integer | string ;
return ast[0], ast[2] # name, value
def object(self, ast):
# object = '{' { record }+ '}' ;
return dict(ast[1])
def integer(self, ast):
# integer = /[0-9]+/ ;
return int(ast)
def string(self, ast):
# string = '"' /[^"]*/ '"';
return ast[1]
with open('input.txt') as file:
text = file.read()
parser = StructuredParser()
ast = parser.parse(text, rule_name='file', semantics=Semantics())
students = [value for name, value in ast if name == 'Student']
d = {'{0[Name.First]} {0[Name.Last]}'.format(s['PInfo']):
dict(School=s['School'], Zip=s['Address']['Zip'])
for s in students}
from pprint import pprint
pprint(d)
输出
{'Joe Burger': {'School': u'West High', 'Zip': 12345},
'John Smith': {'School': u'East High', 'Zip': 12346}}
关于python - 用python处理重复结构化的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26184812/