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

时间:2013-07-05 12:44:32

标签: python exception exception-handling text-files

我正在使用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

请随时对问题批评发表评论,我将很乐意重新解释/澄清问题。

作为参考,前缀question在这里链接

非常感谢,

亚历

2 个答案:

答案 0 :(得分:1)

这样的事情:

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'}

答案 1 :(得分:0)

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

rgx = re.compile('Key +(.*)\r?\n'
                 '(?:.*\r?\n)?'
                 '(?:Word|Letter) +(.*)\r?\n')

mat = rgx.search(ss)
keys = mat.group(1).split(' ')
words = mat.group(2).split('\t')

您可以通过阅读文件获得 ss

with open (filename) as f:
    ss = f.read()

修改

好吧,如果所有行都有使用制表符分隔的数据,您可以执行以下操作:

ss = '''LineHere  w\tx\ty\tz
Key       a 1\tb 2\tc 3\td 4
OrHere    00\t01\t10\t11
Word      as\tbox\tcow\tdig
'''
import re

rgx = re.compile('Key +(.*)\r?\n'
                 '(?:.*\r?\n)?'
                 '(?:Word|Letter) +(.*)\r?\n')

print  dict(zip(*map(lambda x: x.split('\t'),
                     rgx.search(ss).groups())))