2015-07-24 5 views
0

EDITED
Мой код:Python 3.4 pickle.load() не работают

#!/usr/bin/python3 

import os.path 
import pickle 

def read_hts(hts): 
    if(os.path.isfile("hts.pickle")): 
     p = open("hts.pickle", "rb") 
     hts = pickle.load(p) 
     p.close() 
    else: 
     f = open("hts.dat", "r") 
     for line in f: 
     spl = line.split() 
     val = [spl[2], spl[3], spl[4]] 
     hts[spl[0]+"."+spl[1]] = val 
    f.close() 
    p = open("hts.pickle", "wb") 
    pickle.dump(hts, p) 
    p.close() 

def main(): 
    hts = {} 
    read_hts(hts) 
    print(list(hts)) 

main() 

Файл hts.dat:

1 A1 1 1 6523.00 
1 A2 1 2 10823.08 
1 A3 1 3 8661.76 
1 A4 1 4 9851.96 
1 A5 1 5 6701.12 
1 A6 1 6 12934.13 
1 A7 1 7 11882.38 
1 A8 1 8 9787.36 
1 A9 1 9 10292.06 
1 A10 1 10 9040.32 
1 A11 1 11 12742.89 
1 A12 1 12 11607.01 
1 A13 1 13 13638.06 
1 A14 1 14 11038.11 
1 A15 1 15 11839.42 
1 A16 1 16 13206.73 

Если нет hts.pickle выход :

['1.A3', '1.A7', '1.A14', '1.A11', '1.A8', '1.A16', '1.A15', '1.A12', '1.A9', '1.A4', '1.A1', '1.A6', '1.A10', '1.A2', '1.A5', '1.A13'] 

Но если есть hts.pickle выход только:

[] 

Я не понимаю, почему он не восстанавливает диктатор. EDIT: Я думаю, что маринование не проблема. Это должно быть проблемой с переменными.

+0

В первый раз (сброс) он работает нормально, но все мои звонки я получаю пустой список. Я использую python 3.4 – perllover

+0

Все еще не могу воспроизвести. вы не можете попробовать напечатать 'hts' внутри цикла if. И я надеюсь, что вы правильно импортируете «os.path» и «pickle» в начале? –

+0

Я отредактировал мой код. Я думаю, что это проблема с переменными – perllover

ответ

0

Проблема заключается не в рассоле, когда ваш файл рассола уже существует, он создает совершенно новый объект словаря и возвращается, и вы назначаете это обратно переменной hts, это не изменит переменную hts в вашей основной ().

В другой части вы меняете переменную hts на место, поэтому она будет отражать функцию main().

Вместо того, чтобы полагаться на это, вы всегда должны возвращать переменную hts из своей функции и назначать ее обратно в hts в функции main().