解析文件中的特定内容

时间:2013-02-20 08:28:13

标签: python

我有一个看起来像这样的文件

    !--------------------------------------------------------------------------DISK
    [DISK]
    DIRECTION  =  'OK'
    TYPE       =  'normal'

    !------------------------------------------------------------------------CAPACITY
    [CAPACITY]
    code            =    0
    ID          =   110

我想阅读[DISK]和[CAPACITY]部分..会有更多这样的部分。我想阅读这些部分下定义的参数。

我写了以下代码:

file_open = open(myFile,"r")
all_lines = file_open.readlines()
count = len(all_lines)
file_open.close()
my_data = {}
section = None
data = ""
for line in all_lines:
  line = line.strip()                               #remove whitespace
  line = line.replace(" ", "")      
  if len(line) != 0:               # remove white spaces between data        
      if line[0] == "[":
          section = line.strip()[1:]
          data = ""
      if line[0] !="[":
          data += line + "," 
          my_data[section] = [bit for bit in data.split(",") if bit != ""]
print my_data
key = my_data.keys()
print key   

不幸的是,我无法获得这些部分和数据。任何有关这方面的想法都会有所帮助。

3 个答案:

答案 0 :(得分:1)

您是否可以对文本文件进行少量更改?如果你可以看起来像这样(只更改了评论字符):

#--------------------------------------------------------------------------DISK
[DISK]
DIRECTION  =  'OK'
TYPE       =  'normal'

#------------------------------------------------------------------------CAPACITY
[CAPACITY]
code            =    0
ID          =   110

然后解析它是微不足道的:

from ConfigParser import SafeConfigParser

parser = SafeConfigParser()
parser.read('filename')

获取数据如下:

(Pdb) parser
<ConfigParser.SafeConfigParser instance at 0x100468dd0>
(Pdb) parser.get('DISK', 'DIRECTION')
"'OK'"

根据评论进行修改:

如果你正在使用&lt; = 2.7,那么你就是一个小小的SOL ..真正唯一的方法是继承ConfigParser并实现自定义_read方法。实际上,您只需复制/粘贴Lib/ConfigParser.py中的所有内容并编辑第477行(2.7.3)中的值:

if line.strip() == '' or line[0] in '#;': # add new comment characters in the string

然而,如果你正在运行3'(不确定它是在offhand中引入的是什么版本,我正在运行3.4(dev)),你可能很幸运:{{1添加了ConfigParser comment_prefixes参数,以便您自定义前缀:

__init__

答案 1 :(得分:1)

作为others already pointed out,您应该能够使用ConfigParser模块。


尽管如此,如果你想自己实现阅读/解析,你应该把它分成两部分。

第1部分将是文件级别的解析:将文件拆分为块(在您的示例中,您有两个块:DISKCAPACITY)。

第2部分将解析块本身以获取值。

你知道你可以忽略以!开头的行,所以让我们跳过这些:

with open('myfile.txt', 'r') as f:
    content = [l for l in f.readlines() if not l.startswith('!')]

接下来,将这些行读成块:

def partition_by(l, f):
    t = []
    for e in l:
        if f(e):
            if t: yield t
            t = []
        t.append(e)
    yield t

blocks = partition_by(content, lambda l: l.startswith('['))

最后读入每个块的值:

def parse_block(block):
    gen = iter(block)
    block_name = next(gen).strip()[1:-1]
    splitted = [e.split('=') for e in gen]
    values = {t[0].strip(): t[1].strip() for t in splitted if len(t) == 2}
    return block_name, values

result = [parse_block(b) for b in blocks]

就是这样。我们来看看结果:

for section, values in result:
    print section, ':'
    for k, v in values.items():
        print '\t', k, '=', v

输出:

DISK :
        DIRECTION = 'OK'
        TYPE = 'normal'
CAPACITY :
        code = 0
        ID = 110

答案 2 :(得分:-1)

如果文件不大,您可以加载它并使用Regexes查找您感兴趣的部分。