用Python解析复杂文本文件

用Python解析复杂文本文件,python,python-3.3,Python,Python 3.3,我有一个如下所示的文本文件: #some_line @another_line original_string1|new_string1 #some_other_line @and_another_line original_string2|new_string2 我希望能够将每一行与@关联起来,将前一行与#关联起来。 我似乎无法在python中找到实现这一点的策略 这是我目前的代码: with open(self.file, 'r')

我有一个如下所示的文本文件:

#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
我需要能够引用每个父条目并将子条目与之关联。
带有“|”的行也需要与父级关联。

这应该可以完成以下工作:

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
然后


我认为您需要的是从子字符串到父字符串的映射。或者,您可能需要从子字符串和父字符串映射回行号

所以我要做的是:构建从字符串到行号的映射(我假设每一个都是唯一的,但如果不是的话,应该很容易修复),并构建从子行号到父行号的映射。如果您确实需要字符串到字符串的映射,或者其他任何东西,那么您应该能够从中找到答案

“字符串到行号”部分很简单,但对于“子行到父行”部分,我们需要跟踪我们看到的最后一个父行号

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

就是这样。

首先,第[:1]行中的“#”非常奇怪。为什么不仅仅是
line[0]='#'
或者更好的是,
line.startswith('#')
?你想检查比这更复杂的东西吗?同时……在你的数据中,每一行都有一行吗?如果是这样,您的代码应该建立适当匹配的
父级
子级
列表。这样不行吗?或者你只是不知道如何从两个平行列表中构建映射?@abarnert:我可以用它们。谢谢你的建议。基本思想是将该行符号化为一行,该行包含一些“父”数据。在#之后可以有多个@行。啊,好的。我想现在有足够的答案了。让我试试,告诉我我是否做对了。我想他需要能够找到父母的钥匙。这可不行。但我可能对他想要的是错的…完美的…我需要字符串到字符串的引用,但我能找到答案。谢谢你教我如何绘制地图。谢谢你!
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