2015-09-17 14 views
5

Zaczynam od nauki Pythona i napotkałem kilka problemów podczas próby odczytania wartości z pliku.Jak odczytywać wartości parametrów z pliku w Pythonie

Mój plik parametr jest trochę tak:

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

To jest mój kod:

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] 

Jak mogę pobrać ścieżkę prawidłowo? Nie jestem pewien, czy jest to skuteczny sposób robienia rzeczy. Czy możesz mi dać jakieś lepsze sposoby na zrobienie tego?

Nie używam żadnych modułów.

+6

Sugeruję użyć 'configparser' stdlib moduł jeśli chcesz mieć edytowalne przez użytkownika pliki tekstowe w ten sposób. Jeśli nie jest to konieczne, aby można było edytować je przez użytkownika, należy zamiast tego rozważyć opcję "pikle". –

+1

Sprawdź przykład wbudowanego [ConfigParser] (https://wiki.python.org/moin/ConfigParserExamples). Jest to o wiele prostsze niż samodzielne wdrożenie. – shanmuga

Odpowiedz

3

Jak już wspomniano w komentarzach, zdecydowanie zalecamy użycie modułu stdlib, który jest w tym dobry, ale jeśli masz zamiar na toczenia własne, tutaj jest problem:

if fields[0] in "path_value" 

To nie testuje, czy fields[0] jest równa do "path_value", to testowanie jeśli fields[0] jest któregokolwiek z "p", "a", "t", "h", "_" itp

Spróbuj inste ad:

if fields[0] == "path_value" 

Mimo to, wydaje się, że masz zupełnie inny problem, że jeden jest tylko związane z błędem kopiowania/wklejania. Można spróbować zrobić to, jeśli jesteś na Python3:

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

Zamiast pisać niestandardowy format tekstowy i próbuje go odczytać z powrotem, można umieścić swoje parametry do słownika i niech pickle module zrobić resztę Praca.

Możesz użyć pickle.dump(object, file), aby napisać obiekt Python do pliku.

Następnie można użyć object = pickle.load(file), aby odczytać obiekt Python z pliku.

Ten skrypt zapisuje słownika parametrów do pliku:

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) 

Ten skrypt czyta słownika parametrów z pliku:

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

Jeśli nie potrzebujesz tego, aby być czytelnym dla ludzi, jest to absolutnie najlepsza odpowiedź! Możesz nawet robić brzydkie rzeczy, takie jak 'vars(). Update (parametry)' –

+0

Wow, nie wiedziałem o 'vars(). Update()'. To kolejna interesująca rzecz, której nauczyłem się dzisiaj. –

+1

Tak, zdecydowanie polecam przeciwko muckingowi z 'vars()' dict bezpośrednio, ale czasami trzeba użyć brzydkiego narzędzia, aby wykonać brzydką robotę! :) –

Powiązane problemy