0

我有一个如下文本文件:

#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

我需要能够引用每个父条目并将子条目与之关联。带有“|”的行 还需要与父级关联。

4

2 回答 2

1

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

所以这就是我要做的:构建从字符串到行号的映射(我假设每个都是唯一的,但如果不是,它应该很容易修复),并且还构建从子行号到父行号的映射. 如果您确实需要字符串到字符串的映射或其他任何东西,您应该能够从中弄清楚。

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

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

就是这样。

于 2013-08-13T03:30:03.977 回答
0

这应该做的工作:

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'
        }
    }
}
于 2013-08-13T03:28:57.170 回答