Как удалить конкретную строку из текстового файла в Python - PullRequest
0 голосов
/ 08 ноября 2019

Я не знаю, что мне делать, чтобы удалить книгу из файла.

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

Я исследовал, используя .strip(), но кажется, что он не работает, и я не знаком с функцией .strip()

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('\n') != book_to_delete:
                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')

Это мой текстовый файл (listOfBook.txt):

The Great Gatsby
To Kill a Mockingbird
Harry Potter and the Sorcerer's Stone
1984

Ответы [ 5 ]

1 голос
/ 08 ноября 2019

Ваш код в основном корректен, поскольку он правильно удалит символы \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() вызов для пользовательского ввода.

0 голосов
/ 08 ноября 2019
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 = [line.strip() for line in list_of_books]

found_book = False
for i in range(len(books)):
  if books[i] == book_to_delete:
    found_book = True
    break

if found_book == False:
  print("Book not found in the list")
else:
  books.remove(book_to_delete)
  open('listOfBook.txt', 'w').close()

  with open('listOfBook.txt', 'w') as list_of_books:
    for bookTitle in books:
        list_of_books.write('%s\n' % bookTitle)
0 голосов
/ 08 ноября 2019

Это решение открывает файл в режиме r / w ("r +") и использует поиск, чтобы сбросить f-указатель, а затем усечь, чтобы удалить все после последней записи.

book_to_delete = input('Please input the name of the book that will be removed from the library: ')
with open("listOfBook.txt", "r+") as f:
    d = f.readlines()
    f.seek(0)
    for i in d:
        if i != book_to_delete:
            f.write(i)
    f.truncate()
0 голосов
/ 08 ноября 2019

Я немного изменил код и, надеюсь, смогу объяснить некоторые проблемы, которые у вас возникли (некоторые, возможно, просто форматировали вопрос)


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('\n').strip() != book_to_delete:  # Code Changes
                list_of_books.write(book)
            else:                                           # Code Changes
                print(book_to_delete, 'had been removed from the library data base')
    input('Please press enter to go back to staff menu')

Прежде всего я добавилвторой .strip() для проверки в строке 7. Это удалит все пробелы в начале или в конце (что приведет к несоответствию)

Кроме того, я реструктурировал некоторую логику с сообщением «КогдаКнига удалена '

Надеюсь, это будет так, как вы хотите.

0 голосов
/ 08 ноября 2019

Измените свой код следующим образом

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('\n') != book_to_delete:
                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')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...