我有一个看起来像这样的文件
!--------------------------------------------------------------------------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
不幸的是,我无法获得这些部分和数据。任何有关这方面的想法都会有所帮助。
答案 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部分将是文件级别的解析:将文件拆分为块(在您的示例中,您有两个块:DISK
和CAPACITY
)。
第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查找您感兴趣的部分。