Ваш код в основном корректен, поскольку он правильно удалит символы \n
из ваших строк.
У вас также есть проблема с отступом при сообщении пользователю, что книга была удалена, но это может привести кбыть проблема с тем, как вы разместили код в вашем вопросе здесь. Это не влияет на то, как ваш код проверяет каждую строку.
Однако удаление символов \n
из каждого значения book
не означает, что строка, прочитанная из файла, будет соответствовать строке, введенной пользователем:
В ваших строках могут быть лишние пробелы. Труднее увидеть, когда вы открываете файл своей книги в текстовом редакторе, но вы можете проверить это, используя немного больше кода Python.
Попробуйте использовать либо repr()
функцию , либо ascii()
функцию , чтобы напечатать строку, и они будут выглядеть так, как если бы они были строковыми литералами Python. Если вы используете только текст на английском языке, разница между ascii
и repr()
не имеет большого значения;важно то, что вы можете видеть строковое значение таким образом, чтобы упростить поиск таких вещей, как пробелы.
Просто добавьте print("The value of book is:", ascii(book))
и, возможно, print("The value of book_to_delete is:", ascii(book_to_delete))
в свой цикл:
with open('listOfBook.txt', 'w') as list_of_books:
for book in books:
print("The value of book is:", ascii(book))
print("The value of book_to_delete is:", ascii(book_to_delete))
if book.strip('\n') != book_to_delete:
Вы можете удалить аргумент "\n"
из str.strip()
и удалить все пробельные символы из начала и конца, чтобы решить эту проблему:
if book.strip() != book_to_delete.strip():
Вы можете играть с функциейв интерактивном сеансе Python:
>>> book = "The Great Gatsby \n"
>>> book
'The Great Gatsby \n'
>>> print(book.strip("\n"))
The Great Gatsby
>>> print(ascii(book.strip("\n")))
'The Great Gatsby '
>>> print(ascii(book.strip()))
'The Great Gatsby'
Обратите внимание, что print(book.strip("\n"))
на самом деле не показывает вам, что там есть лишние пробелы, но print(ascii(book.strip("\n")))
показывает, согласно расположению цитаты '...'
, чтострока длиннееНаконец, использование str.strip()
без аргументов убрало эти лишние пробелы.
Также обратите внимание, что пользователь также может добавлять лишние пробелы, тоже удалите их.
Пользователь может использовать различное сочетание прописных и строчных букв. Вы можете использовать функцию str.casefold()
`для обоих значений, чтобы гарантировать, что различия в регистре игнорируются:
if book.strip().casefold() != book_to_delete.casefold():
Ваш код, как опубликовано, имеетвопрос отступа. Строки
print(book_to_delete, 'had been removed from the library data base')
input('Please press enter to go back to staff menu')
в настоящее время с отступом попадают под тестовый блок if book.strip('\n') != book_to_delete:
, поэтому они выполняются каждый раз, когда значение book
из вашего файла проверяется и определяется как другая книга. .
Вы хотите удалить достаточное количество отступов, чтобы отступ был только один раз после уровня def delete_book():
, поэтому все еще является частью функции, но не частью какого-либо другого блока:
def delete_book():
book_to_delete = input('Please input the name of the book that will be removed from the library: ')
with open("listOfBook.txt", "r") as list_of_books:
books = list_of_books.readlines()
with open('listOfBook.txt', 'w') as list_of_books:
for book in books:
if book.strip() != book_to_delete.strip():
list_of_books.write(book)
print(book_to_delete, 'had been removed from the library data base')
input('Please press enter to go back to staff menu')
Таким образом, он выполняется только после того, как вы записали в файл все строки, которые не соответствуют book_to_delete
, и файл был закрыт. Обратите внимание, что в приведенном выше примере я также изменил .strip("\n")
на .strip()
и добавил дополнительный strip()
вызов для пользовательского ввода.