1

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

    !--------------------------------------------------------------------------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   

不幸的是,我无法获得这些部分和其中的数据。对此的任何想法都会有所帮助。

4

3 回答 3

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

根据评论编辑:

如果您使用的是 <= 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'ish(不确定它是临时引入的版本,我正在运行 3.4(dev)),您可能很幸运:ConfigParser添加了comment_prefixes __init__参数以允许您自定义前缀:

parser = ConfigParser(comment_prefixes=('#', ';', '!'))

于 2013-02-20T08:45:01.123 回答
1

正如其他人已经指出的那样,您应该能够使用该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
于 2013-02-20T08:56:22.407 回答
-1

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

于 2013-02-20T08:35:44.990 回答