テキストファイルのキー値のペアを解析する

私はPythonの初心者ですが、.txtファイルを解析する方法を検索します。 私の.txtファイルは、次のような計算情報を持つ名前リストです。

myfile.txt

var0 = 16
  var1 = 1.12434E10
  var2 = -1.923E-3
  var3 = 920

どのように値を読み取って、Pythonで myvar0、myvar1、myvar2、myvar3 に入れるか?

12

5 答え

別々のローカル変数ではなく、辞書に値を格納することをお勧めします。

myvars = {}
with open("namelist.txt") as myfile:
    for line in myfile:
        name, var = line.partition("=")[::2]
        myvars[name.strip()] = float(var)

次に、それらを myvars ["var1"] としてアクセスします。名前がすべて有効なPython変数名であれば、これを以下のように置くことができます:

names = type("Names", [object], myvars)

それらの値にアクセスする。 names.var1

40
追加された
ファイルcasが '#これはコメント行です'とコメントした場合はどうなりますか?
追加された 著者 Aryeh Armon,
私の場合、名前にstrip()を使用するのは冗長ですが、varの改行によって問題が発生しました。だから、私のためにうまくいったのは、myvars [name] = float(var.strip())でした。
追加された 著者 snow6oy,

Try python standard module configparser

11
追加された
注:ファイルにセクションヘッダーが含まれておらず、OPの例にヘッダーがない場合、configparserは MissingSectionHeaderError をスローします。 @Lauritzによるカスタムソリューションは、おそらく使用するための回避策ヘッダーのないconfigparser
追加された 著者 7yl4r,

@kevが示唆するように、configparserモジュールはやり方です。

However in some scenarios (a bit ugly, I admit) but very simple and effective way to do to this is to rename myfile.txt to myfile.py and do a from myfile import * (after you fix the typo var 0 -> var0)

しかし、これは非常に安全ではありませんので、ファイルが外部ソースからのものである場合や悪意のある攻撃者からのものである場合は、盲目的に実行する代わりにデータを検証する何か

1
追加された

私は個人的にすべてのパラメータを変数として含む.pyファイルを作成することでこれを解決しました。

include PARAMETERS.py

パラメータを必要とするプログラムモジュールで実行されます。

ちょっと醜いですが、非常にシンプルで使いやすいです。

1
追加された

単一の行に複数のコンマ区切りの値がある場合、それを解析するコードは次のとおりです。

    res = {}                                                                                                                                                                                             

    pairs = args.split(", ")                                                                                                                                                                             
    for p in pairs:                                                                                                                                                                                      
        var, val = p.split("=")                                                                                                                                                                          
        res[var] = val                                                                                                                                                                                   
0
追加された