Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 28, 2015 22:42:20

valeal
Зарегистрирован: 2015-10-18
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Очищает файл при некорректном завершении работы программы.

Всем привет,

Возникла одна проблемка - при некорректном завершении работы программы (закрытие сеанса командной строки 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

Офлайн

#2 Ноя. 29, 2015 02:43:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Очищает файл при некорректном завершении работы программы.

f.close()



Офлайн

#3 Ноя. 29, 2015 07:28:06

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Очищает файл при некорректном завершении работы программы.

valeal
при некорректном завершении работы программы (закрытие сеанса командной строки Windows XP
Некорректное завершение обычно обрабатывают в блоке try… finally. В windows XP вышибание программы по ctrl-C приведет к срабатыванию finally блоков. Но если вы закроете консоль нажатием на крестик, то никто и пискнуть не успеет.
Вам надо привести последовательность действий которая приводит к ошибке и что вы считаете признаками ошибки. Без этого никто и разбираться не будет.
valeal
'2\r'
Очень странно, неужели ‘2’ не работает? так точно не надо делать. Вообще принято не цифрами обозначать действия а понятными сокращениями т.е.
 ModeChoice=input("""
Вы хотите заполнить словарь или начать обучение
a-заполнять(add)
l-учить(learn)
Любая другая комбинация завершит работу программы.
""")

Попытка открыть несуществующий файл - занятие пустое.



Отредактировано doza_and (Ноя. 29, 2015 07:31:30)

Офлайн

#4 Ноя. 29, 2015 14:49:58

valeal
Зарегистрирован: 2015-10-18
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Очищает файл при некорректном завершении работы программы.

Вроде как сама разобралась.
Чтобы всё заработало, достаточно было убрать f из global для Save_Dict и Load_Dict.
Правда не совсем поняла, почему это решило проблему.

Теперь все данные сохраняются в файл при любом завершении программы (даже нажатии на крестик окна командной строки).

По поводу ‘2\r’:
На самом деле была написана функция

def input_r(String):
    """УБИРАЕМ СИМВОЛ ВОЗВРАТ КАРЕТКИ (\r).
    
    String
    A - local
    """
    A=input(String).rstrip('\r')
    return A

Я просто её убрала из приведённого кода, поскольку к вопросу она не имела отношения.
Без этой функции просто 2 не работает.
Так как для интерпретатора введение 2 и нажатии Enter это по сути ‘2\r’, как я поняла.
Я новичок и возможно что-то не знаю - для себя эту проблему решила с помощью функции.

За совет по поводу действий - спасибо, применила.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version