2015-09-17 20 views
5

ファイルから値を読み取ろうとしているときにPythonを学び始めていて、いくつかの問題が発生しました。Pythonでファイルからパラメータ値を読み取る方法

マイパラメータ・ファイルには、多少、このようなものです:

var1 11111111 
path_value "some/space containing path/file.txt" 
var3 something 
#some other values 
var4 some/value1 
var5 some/value2 
var6 some/value3 

これは私のコードです:

file=open('this_file.txt') 
for line in file: 
    fields = line.strip().split() 
    if(fields[0] in "var1"): 
     ## this will give me 11111111 
     var_1_value=fields[1] 
    if(fields[0] in "path_value"): 
     ## this will give me only till "/some/space 
     path_value_contains=fields[1] 

私は適切にパスを取得するにはどうすればよいですか?私はこれが効率的なやり方であるとは思わない。これを行うためのよりよい方法を教えてください。

私はモジュールを使用していません。

+6

私は強くあなたが 'configparser' STDLIBモジュールを使用することをお勧めこのようなユーザー編集可能なテキストファイルを使用する場合ユーザーが編集できる必要がない場合は、代わりに 'pickle'を考慮してください。 –

+1

inbuilt [ConfigParser](https://wiki.python.org/moin/ConfigParserExamples)の例を参照してください。これはあなた自身で実装するよりはるかに簡単です。 – shanmuga

答えて

3

私はコメントで述べたように、私は強くあなたがこの得意だSTDLIBモジュールを使用しますが、あなた自身をロール上の意図している場合は、ここで問題なのをお勧めします:

if fields[0] in "path_value" 

場合のテストではないですfields[0]"p"のいずれか、"a""t""h""_"など

するTry insteある場合fields[0]"path_value"から等しいあり、それはテストです広告:

言っ
if fields[0] == "path_value" 

、あなたが全く異なる問題を抱えているようで、その一つは、単にコピー/ペーストエラーに関連しています。あなたがのpython3にしている場合は、これをやって試すことができます:

for line in file: 
    param_name, *param_values = line.split() 
    param_value = ' '.join(param_values) 
    # then proceed as usual 
2

代わりにカスタムテキストフォーマットを書き込み、それを読み戻すしようとしているの、あなたが辞書にあなたのパラメータを入れてpickle moduleはの残りの部分をやらせることができます作品。

pickle.dump(object, file)を使用して、Pythonオブジェクトをファイルに書き込むことができます。

その後、object = pickle.load(file)を使用して、ファイルからPythonオブジェクトを読み取ることができます。

このスクリプトは、ファイルにパラメータの辞書を書き込みます:

parameters = { 
    'var1': 11111111, 
    'path_value': 'some/space containing path/file.txt', 
    'var3': 'something', 
    'var4': 52 
    } 

import pickle 

file_name = 'parameters.pickled' 

with open(file_name, 'wb') as out_file: 
    pickle.dump(parameters, out_file) 

このスクリプトは、ファイルからパラメータの辞書を読み取ります

import pickle 

file_name = 'parameters.pickled' 

parameters = pickle.load(open(file_name, 'rb')) 

var1 = parameters['var1'] 
path = parameters['path_value'] 

print('var1 =', var1) 
print('path =', path) 
+0

これを人間が読めるようにする必要がない場合は、これが最良の答えです! 'vars()。update(parameters)'のような醜いことさえできます。 –

+0

うわー、私は 'vars()。update()'について知らなかった。それは私が今日学んだ別の興味深いものです。 –

+1

ええ、私は 'vars()' dictで直接マックすることを強く推奨しますが、醜い仕事をするためには醜いツールを使う必要があることがあります。 :) –

関連する問題