从特殊格式的文本文件中读取数据


问题内容

我使用的是Ashwini Chaudhary所建议的这种方法,用于将数据从特定格式的文本文件分配给字典。

keys = map(str.strip, next(f).split('Key\t')[1].split('\t'))
words = map(str.strip, next(f).split('Word\t')[1].split('\t'))

文本文件具有行标题,后跟值,并用\t字符分隔。

范例1:

Key      a 1  b 2  c 3  d 4
Word     as   box  cow  dig

如何更改代码以不读取文件中的所有行,而仅读取特定行?我不想阅读的多余的行应该被忽略:

示例2-忽略LineHereOrHere行:

LineHere  w    x    y    z
Key       a 1  b 2  c 3  d 4
OrHere    00   01   10   11
Word      as   box  cow  dig

或者,如果我想读取标题为“ Word”,“ XOR”或“ Letter”的行,则碰巧出现在文件中。因此,用于扫描示例1或2的代码也适用于:

示例3-我想阅读KeyLetter第:

LineHere  w    x    y    z
Key       a 1  b 2  c 3  d 4
OrHere    00   01   10   11
Letter    A    B    C    D

请随时提出问题评论,我很乐意重新表述/澄清问题。

作为参考,此处链接了先驱问题

非常感谢,

亚历克斯


问题答案:

像这样:

import re
with open('abc') as f:
    for line in f:
        if line.startswith('Key'):
            keys = re.search(r'Key\s+(.*)',line).group(1).split("\t")
        elif line.startswith(('Word','Letter')):
            vals = re.search(r'(Word|Letter)\s+(.*)',line).group(2).split("\t")

    print dict(zip(keys,vals))

abc

LineHere  w    x    y    z
Key       a 1  b 2  c 3  d 4
OrHere    00   01   10   11
Word      as   box  cow  dig

输出是:

{'d 4': 'dig', 'b 2': 'box', 'a 1': 'as', 'c 3': 'cow'}

abc

LineHere  w    x    y    z
Key       a 1  b 2  c 3  d 4
OrHere    00   01   10   11
Letter    A    B    C    D

输出是:

{'d 4': 'D', 'b 2': 'B', 'a 1': 'A', 'c 3': 'C'}