@vlad09996

Как удалить конкретную строку из файла с помощью write(), что бы удаление не затрагивало заодно первую строку?

Выполняю такую задачку:
"""Создайте собственную программу «Адресная книга», работающую из командной строки и позволяющую просматривать, добавлять, изменять, удалять или искать контактные
данные ваших знакомых. Кроме того, эта информация также должна сохраняться на диске для последующего доступа."""
Вот код:
class MyLog:
	def __init__(self, name, number):
		self.name = name
		self.number = number
	def __repr__(self):
		return "Name: {0}. Number: {1}\n".format(self.name, self.number)

while True:
	action = input('Enter the command: ')
	if action == 'add':
		name = input("\nEnter name: ")
		number = input("Enter number: ")
		contact = MyLog(name, number)
		read_log = open('log_file.txt')
		line = read_log.readline()
		read_log.close()
		if len(line) == 0:
			amount_line = sum(1 for line in open('log_file.txt', 'r')) + 1
		else:
			amount_line = sum(1 for line in open('log_file.txt', 'r'))
		if len(line) == 0:
			template = 'Contact log:\r'
		else:
			template = ''
		add_log = open('log_file.txt', 'a')
		add_log.write(template + '{0}. '.format(amount_line) + str(contact))
		add_log.close()
		print('\nContact saved: ' + '{0}.'.format(amount_line) + str(contact))
	if action == 'check':
		read_log = open('log_file.txt')
		while True:
			line = read_log.readline()
			if len(line) == 0:
				read_log.close()
				break
			print(line)
	if action == 'delete':
		num_contact = input('Number contact: ')
		read_log = open('log_file.txt', 'r')
		line = read_log.readline()
		delete_log = open('log_file.txt', 'w')
		for line in read_log:
			if not line.startswith(num_contact):
				delete_log.write(line)
				print(line)
		read_log.close()
		delete_log.close()
	if action == 'close':
		break
	else:
		print('\nCommand not defined!\n')

Проблема состоит в том, что при выполнении команды 'delete' программа удаляет не только строку по заданным параметрам, а еще и самую первую строку. Еще одна проблема - это вывод оповещения "Command not defined!", которое должно срабатывать только после ввода несуществующей команды, а оно почему-то срабатывает после завершения других команд.
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix Куратор тега Python
yellow
Она ничего не удаляет, вы сами убрали первую строку, выполнив это действие: line = read_log.readline() (причем бессмысленное действие, для чего оно?)
Прочитав строку из файла, вы сдвинули указатель на следующую строчку, соответственно, цикл for line in read_log: начался уже со второй строки.

почему-то срабатывает после завершения других команд

Оно срабатывает при условии, если action не равно 'close', ну и если вы вводите delete, то и выводится Command not defined!, так как delete != close.

Используйте elif, если вам нужны дополнительные проверки в одном блоке if

if action == 'add':
  # ...
elif action == 'check'
  # ...
elif action == 'delete'
  # ...
else:
  print('\nCommand not defined!\n')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы