[英]Parsing complex text file in Python
我有一个如下文本文件:
#some_line
@another_line
original_string1|new_string1
#some_other_line
@and_another_line
original_string2|new_string2
我希望能够将带有@的每一行关联到带有#的前一行。 我似乎无法找出一种在python中实现这一目标的策略。
这是我当前的代码:
with open(self.file, 'r') as f:
for i, line in enumerate(f):
line = line.strip(' \t\n\r')
if '#' in line[:1]:
self.parent[i] = line[1:]
if '@' in line[:1]:
self.child[i] = line[1:]
if '|' in line:
key, value = line.split('|')
self.strings[key] = value
我需要能够引用每个父条目并将其与子条目关联。 带“ |”的行 还需要与父级关联。
我认为您想要的是从子字符串到父字符串的映射。 或者,也许您希望将子字符串和父字符串映射回行号。
所以,这就是我要做的:建立从字符串到行号的映射(我假设每个映射都是唯一的,但是如果不是的话,应该很容易解决),还建立从子行号到父行号的映射。 。 如果您确实需要字符串到字符串的映射或其他任何内容,则应该可以从中找出来。
字符串到行号部分是微不足道的,但是对于子级到父级部分,我们需要跟踪我们看到的最后一个父级行号。
child_lines, parent_lines, child_parents = {}. {}. {}
last_parent_line = None
with open(self.file) as f:
for i, line in enumerate(f):
line = line.strip(' \t\n\r')
marker, value = line[0], line[1:]
if marker == '#':
parent_lines[value] = i
last_parent_line = i
elif marker == '@':
child_lines[value] = i
child_parents[i] = last_parent_line
而已。
这应该做的工作:
with open(self.file, 'r') as f:
self.result = {}
for line in f.readlines():
line = line.strip()
if line.startswith("#"):
parent = line[1:]
self.result[parent] = {}
if line.startswith("@"):
child = line[1:]
self.result[parent][child] = {}
if '|' in line:
key, value = line.split('|')
self.result[parent][child][key] = value
然后
print self.result
>>> {
'some_other_line': {
'and_another_line': {
'original_string2': 'new_string2'
}
},
'some_line': {
'another_line': {
'original_string1': 'new_string1'
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.