55

この質問を参照すると、同様の問題がありますが、同じではありません..

途中で、次のような構造のテキスト ファイルが作成されます。

var_a: 'home'
var_b: 'car'
var_c: 15.5

そして、Python がファイルを読み取ってから、var_a という名前の変数を値「home」で作成する必要があります。

例:

#python stuff over here
getVarFromFile(filename) #this is the function that im looking for
print var_b
#output: car, as string
print var_c
#output 15.5, as number.

これは可能ですか、つまり、var 型を保持することさえできますか?

私はテキスト ファイル構造に対して完全な自由を持っていることに注意してください。私が提案した形式が最適でない場合は、好きな形式を使用できます。

編集: ConfigParser は解決策になる可能性がありますが、スクリプトではファイル内の変数を参照する必要があるため、あまり好きではありません。

config.get("set", "var_name")

しかし、Pythonスクリプトで宣言したように、変数を直接参照するのが大好きです...

ファイルを python 辞書としてインポートする方法はありますか?

最後に、テキスト ファイルに含まれる変数の数が正確にはわからないことを覚えておいてください。

編集 2 : ステファンの JSON ソリューションに非常に興味があります。その方法では、テキスト ファイルを他の言語 (たとえば、PHP、次に AJAX JavaScript 経由) で簡単に読み取ることができますが、そのソリューションを実行しているときに何かに失敗します:

#for the example, i dont load the file but create a var with the supposed file content
file_content = "'var_a': 4, 'var_b': 'a string'"
mydict = dict(file_content)
#Error: ValueError: dictionary update sequence element #0 has length 1; 2 is required
file_content_2 = "{'var_a': 4, 'var_b': 'a string'}"
mydict_2 = dict(json.dump(file_content_2, True))
#Error:
#Traceback (most recent call last):
#File "<pyshell#5>", line 1, in <module>
#mydict_2 = dict(json.dump(file_content_2, True))
#File "C:\Python26\lib\json\__init__.py", line 181, in dump
#fp.write(chunk)
#AttributeError: 'bool' object has no attribute 'write'

JSON 形式ではどのような問題が発生する可能性がありますか? また、テキスト ファイルで JSON 配列を読み取り、それを python dict に変換するにはどうすればよいですか?

PS: .py ファイルを使用したソリューションは好きではありません。1 つの言語に限定されない .txt、.inc、.whatever を優先します。

4

11 に答える 11

99

しかし、私が気に入っているのは、Pythonスクリプトで宣言したように、変数direcltyを参照することです。

構文を少し変更しても問題ないと仮定して、Pythonを使用して「config」モジュールをインポートします。

# myconfig.py:

var_a = 'home'
var_b = 'car'
var_c = 15.5

その後、

from myconfig import *

また、現在のコンテキストで名前でそれらを参照できます。

于 2009-05-29T07:54:55.713 に答える
32

テキスト ファイルを Python モジュールとして扱い、以下を使用して動的にロードできimp.load_sourceます。

import imp
imp.load_source( name, pathname[, file]) 

例:

// mydata.txt
var1 = 'hi'
var2 = 'how are you?'
var3 = { 1:'elem1', 2:'elem2' }
//...

// In your script file
def getVarFromFile(filename):
    import imp
    f = open(filename)
    global data
    data = imp.load_source('data', '', f)
    f.close()

# path to "config" file
getVarFromFile('c:/mydata.txt')
print data.var1
print data.var2
print data.var3
...
于 2009-05-29T06:56:12.460 に答える
32

ConfigParser を使用します。

あなたの設定:

[myvars]
var_a: 'home'
var_b: 'car'
var_c: 15.5

あなたのpythonコード:

import ConfigParser

config = ConfigParser.ConfigParser()
config.read("config.ini")
var_a = config.get("myvars", "var_a")
var_b = config.get("myvars", "var_b")
var_c = config.get("myvars", "var_c")
于 2009-05-29T06:57:58.403 に答える
18

JSONまたはPyYAMLを含むファイルをディクショナリにロードしthe_dict(この手順については、JSONまたはPyYAMLのドキュメントを参照してください。どちらもデータ型を格納できます)、たとえばを使用して、ディクショナリをグローバルディクショナリに追加しますglobals().update(the_dict)

代わりにローカルディクショナリ(関数内など)で使用する場合は、次のように実行できます。

for (n, v) in the_dict.items():
    exec('%s=%s' % (n, repr(v)))

安全に使用できる限りexec。そうでない場合は、辞書を直接使用できます。

于 2009-05-29T07:42:27.533 に答える
7

ここに投稿された他の解決策は私にはうまくいきませんでした:

  • 通常のスクリプトのファイルからパラメータが必要でした
  • import *別のファイルを選択してそれらをオーバーライドする方法が必要なため、私にはうまくいきませんでした
  • コメントが必要だったので、dictを含むファイルだけでは問題ありませんでした。

だから私は使ってConfigparserしまいましたglobals().update()

テストファイル:

#File parametertest.cfg:
[Settings]
#Comments are no Problem
test= True
bla= False    #Here neither

#that neither

これが私のデモスクリプトです。

import ConfigParser

cfg = ConfigParser.RawConfigParser()
cfg.read('parametertest.cfg')       # Read file

#print cfg.getboolean('Settings','bla') # Manual Way to acess them

par=dict(cfg.items("Settings"))
for p in par:
    par[p]=par[p].split("#",1)[0].strip() # To get rid of inline comments

globals().update(par)  #Make them availible globally

print bla

今は1つのセクションを持つファイルだけですが、それは簡単に採用できます。

それが誰かのために役立つことを願っています:)

于 2012-08-03T16:21:55.587 に答える
4

「test.txt」という名前のファイルがあるとします。

a=1.251
b=2.65415
c=3.54
d=549.5645
e=4684.65489

そして、変数(a、b、c、dまたはe)を見つけたい:

ffile=open('test.txt','r').read()

variable=raw_input('Wich is the variable you are looking for?\n')

ini=ffile.find(variable)+(len(variable)+1)
rest=ffile[ini:]
search_enter=rest.find('\n')
number=float(rest[:search_enter])

print "value:",number
于 2012-03-22T03:43:22.323 に答える
3

あなたのフォーマットはどれくらい信頼できますか?セパレータが常に正確に':'である場合、次のように機能します。そうでない場合は、比較的単純な正規表現で十分です。

かなり単純な変数型を使用している限り、Pythonのeval関数を使用すると、変数をファイルに永続化するのが驚くほど簡単になります。

(以下はあなたに辞書を与えます、ところで、あなたがあなたが好んだ解決策の1つであるとあなたが言った)。

def read_config(filename):
    f = open(filename)
    config_dict = {}
    for lines in f:
        items = lines.split(': ', 1)
        config_dict[items[0]] = eval(items[1])
    return config_dict
于 2009-05-29T08:27:04.040 に答える
1

ロードするファイルがサブディレクトリにある場合、またはダッシュで名前が付けられている場合、hbnの答えはそのままでは機能しません。

そのような場合、次の代替案を検討できます。

exec open(myconfig.py).read()

または、より単純ですが python3 で廃止されました:

execfile(myconfig.py)

ただし、Stephan202 の警告は両方のオプションに適用されると思いますが、行のループの方が安全かもしれません。

于 2016-02-20T17:55:43.263 に答える
0

あなたが望んでいるように見えるものは次のとおりですが、これは推奨されません

>>> for line in open('dangerous.txt'):
...     exec('%s = %s' % tuple(line.split(':', 1)))
... 
>>> var_a
'home'

これにより、PHPと多少似た動作が発生するregister_globalsため、同じセキュリティ問題が発生します。さらに、exec私が示したものを使用すると、任意のコードが実行される可能性があります。これは、テキストファイルの内容がすべての状況で信頼できることが確実である場合にのみ使用してください。

変数をローカルスコープではなくオブジェクトにバインドすることを実際に検討し、コードが実行されないようにファイルの内容を解析するライブラリを使用する必要があります。したがって、ここで提供されている他のソリューションのいずれかを使用してください。

(注意:この回答を解決策としてではなく、明示的な解決策として追加しました。)

于 2009-05-29T07:55:57.770 に答える