2016-08-10 8 views
0

Pythonでスクリプトをコーディングして.INIファイルを読み込む。私はconfigparserと呼ばれるライブラリがあることを知っていますが、私の.INIは "標準"と少し異なります。一般的に非従来のINIをPythonで読む

、ファイルは次のようにする必要があります:

[HEADER] 
username john 
fruits oranges apples 

ことまたはIを行うための簡単な方法があります:

[HEADER] 
username = john 
fruits = oranges, apples 

が、私の場合、私はそのような何かを読む必要があり私自身のパーサーを作らなければなりませんか?

- 編集 -

みんな、答えに感謝します。私は非常に重要なことに言及するのを忘れた。 INIファイル(独自の痛みを伴うソフトウェアによって生成されます)では、同じキーを持つ複数の行を持つこともできます。私はあなたに例を挙げます。

[HEADER] 
day1 bananas oranges 
day1 apples avocado 
day2 bananas apples 
+4

の標準解析と同じように解析しても、あまりにもではありませんハード - あなたのパラメータ名の中に空白が含まれていない限り、 'line.split( '')'のようなもので逃げることができます。 –

+0

'newline = line.split( '')[0] +" = "+"、 ".join(line.split( '')[1:]' – handle

+1

あなたのiniから通常のiniに変換するだけです。単純に見えますが、そのフォーマットに複雑さが潜んでいる可能性があります。同じヘッダーが2回表示された場合は、追加または上書きしますか?置換変数を許可しますか?コメントを付けることができますか?どのように表現されていますか?Confiig構文解析は暗い芸術です! – tdelaney

答えて

0

これは、独自のパーサーを処理する必要があります。私はまだそれをConfigParserオブジェクトにドロップしますが、それだけで将来もっと簡単に使用できるようになります。 configparser.ConfigParserのようにほとんどする必要があります。私はあなたの質問の終わり近くに言及としてconfig["SomeHeader"]["foo"] == ["bar", "baz"]として

[SomeHeader] 
foo = bar 
foo = baz 

を治療するためにそれを伝えるためにどのような方法を認識していませんよ。

あなたのような何かを試みることができる:これは、ようになります

def is_section_header(text): 
    # what makes a section header? To me it's a word enclosed by 
    # square brackets. 
    match = re.match(r"\[([^\]]+)\]", text) 
    if match: 
     return match.group(1) 

def get_option_value_tuple(line): 
    """Returns a tuple of (option, comma-separated values as a string)""" 
    option, *values = line.split(" ") 
    return (option, ", ".join(values)) 

def parse(filename): 
    config = configparser.ConfigParser() 
    cursection = None 
    with open(filename) as inifile: 
     for line in inifile: 
      sectionheader = is_section_header(line) 
      if sectionheader: 
       cursection = sectionheader 
       try: 
        config.add_section(sectionheader) 
       except configparser.DuplicateSectionError: 
        # This section already exists! 
        # how should you handle this? 
        continue # ignore for now 
      else: 
       option, values = get_option_value_tuple(line.strip()) 
       if config.has_option(cursection, option): 
        config[cursection][option] += (", " + values) 
       else: 
        config[cursection][option] = values 
    return config 

を:

[SomeHeader] 
foo bar baz 
foo spam eggs 
bar baz 

はこれを手動で解析

[SomeHeader] 
foo = bar, baz, spam, eggs 
bar = baz 
+1

皆さん、ありがとうございました。アダムありがとう。私は動作するコードを期待していませんでしたが、プログラミングの初心者なので、本当に助けになります。 –

関連する問題