Форум сайта python.su
0
Всем привет, 
Возникла одна проблемка - при некорректном завершении работы программы (закрытие сеанса командной строки Windows XP) после прохождения одного цикла не сохраняются данные в файл, при том, что цикл завершается командой сохранения.
В принципе данных в файле нет в момент выбора режима 1 или 2, хотя функция сохранения вызывается до перехода.
# ФУНКЦИЯ ЗАГРУЖАЮЩАЯ СЛОВАРЬ def Load_Dict(): # MOD Изменить загрузку списков, так чтобы при вводе нового не удалялись старые с помощью перевода строки в переменную locals()['name'] = "Nata" global f,English f=open('Dictionary.txt','rb') import pickle try: English = pickle.load(f) except EOFError: English=[] f.close # ФУНКЦИЯ СОХРАНЯЮЩАЯ СЛОВАРЬ def Save_Dict(): global f,English if len(English)!=0: f=open('Dictionary.txt','wb') import pickle pickle.dump(English, f) f.close while True: ModeChoice=input(""" Вы хотите заполнить словарь или начать обучение 1-заполнять 2-учить Любая другая комбинация завершит работу программы. """) if ModeChoice=='1\r': # РЕЖИМ ЗАПОЛНЕНИЯ Load_Dict() while True: Eng_word = input('Введите слово:\n') if English.count(Eng_word) != 0: print('Данное слово уже есть в словаре.',Eng_word,' = ', Russian[English.index(Eng_word)],'\n') Correct_word=input(""" Введите 1 - если хотите поменять значение слова; 2 - если хотите удалить слово; любая другая комбинация оставит слово в словаре без изменения """) if Correct_word=='1\r': N=English.index(Eng_word) del(English[N]) elif Correct_word=='2\r': N=English.index(Eng_word) del(English[N]) continue else: continue if Eng_word=='\r': break English.append(Eng_word) Save_Dict() print(English) #всп elif ModeChoice=='2\r': # # РЕЖИМ ОБУЧЕНИЯ print('режим обучения') else: print('Вы завершили работу с программой. До новых встреч!') break
Офлайн
857
f.close()
Офлайн
253
valealНекорректное завершение обычно обрабатывают в блоке try… finally. В windows XP вышибание программы по ctrl-C приведет к срабатыванию finally блоков. Но если вы закроете консоль нажатием на крестик, то никто и пискнуть не успеет.
при некорректном завершении работы программы (закрытие сеанса командной строки Windows XP
valealОчень странно, неужели ‘2’ не работает? так точно не надо делать. Вообще принято не цифрами обозначать действия а понятными сокращениями т.е.
'2\r'
ModeChoice=input(""" Вы хотите заполнить словарь или начать обучение a-заполнять(add) l-учить(learn) Любая другая комбинация завершит работу программы. """)
Отредактировано doza_and (Ноя. 29, 2015 07:31:30)
Офлайн
0
Вроде как сама разобралась.
Чтобы всё заработало, достаточно было убрать f из global для Save_Dict и Load_Dict.
Правда не совсем поняла, почему это решило проблему.
Теперь все данные сохраняются в файл при любом завершении программы (даже нажатии на крестик окна командной строки).
По поводу ‘2\r’:
На самом деле была написана функция
def input_r(String): """УБИРАЕМ СИМВОЛ ВОЗВРАТ КАРЕТКИ (\r). String A - local """ A=input(String).rstrip('\r') return A
Офлайн