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.py477 行 (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いるように、モジュール を使用できるはずです。


それにもかかわらず、読み取り/解析を自分で実装したい場合は、それを 2 つの部分に分割する必要があります。

パート 1 は、ファイル レベルでの解析です。ファイルをブロックに分割します (この例では、2 つのブロックがあります: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

ファイルが大きくない場合は、ファイルを読み込んで、Regexes を使用して関心のある部分を見つけることができます。

于 2013-02-20T08:35:44.990 に答える