Код не удаляет строку из файла, когда в файле одна строка

Пользователь вводит строку, которую хочет удалить из файла. Код перезаписывает в файл все строки кроме нужной. Когда остается одна строчка, она не удаляется. Нужно сделать так, чтобы удалялась последняя строка и файл становился чистым.

def zadachs():
    ask='Введите желаемый номер пункта (1 - просмотр текущих задач, 2 - запись новых задач, 3 - удаление существующей задачи, 4 - выход из программы): '
    vopros1='Напишите здесь Вашу новую задачу: '
    vopros2='Введите задачу, которую вы хотите удалить: '
    while True:
        b=input(ask)
        try:
            b=int(b)
        except ValueError:
            print("Введите номер пункта")
            continue
        if b==4:
            break
        if b==1:
            with open(r'C:\Users\username\test\zadachi.txt', 'r') as f:
                zd=f.read()
                print(zd)
                if len(zd)==0:
                    print("На текущий момент задач нет")
        elif b==2:
            zadacha = input (vopros1)
            with open(r'C:\Users\username\test\zadachi.txt', 'a') as f:
                f.write('\n' + zadacha)
        elif b==3:
            dell = input (vopros2)
            f=open(r'C:\Users\username\test\zadachi.txt', 'r')
            lines=f.readlines()
            f.close()
            f=open(r'C:\Users\username\test\zadachi.txt', 'w')
            f.truncate()
            for line in lines:
                if line != dell + '\n':
                    f.write(line)
            f.close()
        else:
            print('Такого пункта нет')
    
zadachs()

Ответы (1 шт):

Автор решения: insolor

Когда у вас в файле остается одна строка, которую нужно удалить, ваш код ничего не записывает в файл, поэтому исходное его содержимое не удаляется (если записать что-то в файл открытый в режиме 'w', то файл будет очищен автоматически, но если ничего не записать, то очистка не произойдет). Можно принудительно очищать файл перед записью в него с помощью метода truncate(). Также, у последней строки в файле не будет символа '\n' в конце, поэтому нужно наоборот обрезать символ переноса строки (.rstrip('\n')) и сравнивать строки без него:

f=open(r'C:\Users\username\test\zadachi.txt', 'w')
f.truncate()  # Обрезать все содержимое файла, идущее после текущей позиции
for line in lines:
    if line.rstrip('\n') != dell:
        f.write(line)
f.close()
→ Ссылка