Как я могу найти что-то в текстовом файле и вывести его детали в python? - PullRequest
0 голосов
/ 01 февраля 2020

Цель моей программы - отобразить меню, которое сможет предоставить вам возможность добавить новую «Книгу» с ее сведениями, такими как автор, цена и копии, в текстовый файл. Вторая часть программы должна запросить у пользователя ввод имени автора, после чего программа должна найти имя этого автора в текстовом файле и отобразить книги, цены и копии, относящиеся к этому автору. Моя проблема в том, что я не уверен, как именно выполнить вторую часть. «Линия» разделена на 4 части: «Автор», «Книга», «Цена» и «Копии». Автор содержит 16 символов, книга содержит 20 символов, цена содержит 5, а копии - 2. Допустим, автор - Дж. К. Роулинг, то есть 12 символов, у меня есть функция, которая добавляет "" (пробелы), чтобы удовлетворить условию того, что это 16 То же самое касается всех подразделений. В конце скажем, что это книга Дж. К. Роулинг о Гарри Поттере 2 12.9912. Автор: "Джоан Роулинг" Книга: "Книга Гарри Поттера 2" Цена: "12.99" Копии: "12" Это технически объяснение первой части. Вторая часть должна искать «Дж. К. Роулинг», а затем получать результаты:

Автор: «Дж. К. Роулинг» Книга: «Книга Гарри Поттера 2» Цена: «12.99» Копии: «12»

Если есть гораздо более эффективный способ, чем этот, то он будет очень признателен, но сейчас основной проблемой является часть 2.

ps Это должно быть сделано через текстовый файл

Полная программа (часть 1 работает):

def AddSpaces(auth,numb):
    print("Runs")
    while len(auth) < numb:
        auth = auth + " "
    return (auth)



menu = 1
while menu <= 2:
    menu = int(input("1. Add a new book\n2. Search for a new book by a given author\n3. End"))
    if menu ==1:

        BOOKS = open("BOOKS.txt","a")

        Author = str(input("Author: "))
        if len(Author) < 16:
            Author = AddSpaces(Author,16)
        while len(Author) > 16:
            Author = str(input("Author: "))
            Author = AddSpaces(Author,16)
        print(Author)

        Book = str(input("Book: "))
        if len(Book) < 20:
            Book = AddSpaces(Book,20)
        while len(Book) > 16:
            Book = str(input("Book: "))
            Book = AddSpaces(Book,20)
        print(Book)

        Price = str(input("Price: "))
        while len(Price)>5:
            Price = str(input("Price: "))

        Copies = str(input("Copies: "))
        while len(Copies)>2:
            Copies = str(input("Copies: "))

        line = Author + Book + Price + Copies +"\n"
        print(line)
        BOOKS.write(line)
        BOOKS.close()


    elif menu == 2:
        BOOKS = open("BOOKS.txt","r")
        while True:
            AuthorSearch = str(input("Author name for search: "))
            if len(AuthorSearch) < 16:
                AuthorSearch = AddSpaces(AuthorSearch,16)
            while len(AuthorSearch) > 16:
                AuthorSearch = str(input("Author name for search: "))
                AuthorSearch = AddSpaces(AuthorSearch,16)
            print(AuthorSearch)

            n = BOOKS.read()
            if n == "":
                print("End of file, no books found")
                break
            if AuthorSearch == line[:16]:
                print ("Author found.")
                print ("Author name: ") + (line[:16])
                print ("Book name: ") + (line[17:36])
                print ("Price: ") + (line[37:41])
                print ("Copies: ") + (line[42:43])

1 Ответ

0 голосов
/ 01 февраля 2020

Вот простая модификация вашего кода, которая обрабатывает части 1 и 2

Моды, основанные на следующих

  1. Использование Python соглашения об именах переменных Pep 8
  2. Используйте строку с разделителями табуляции, чтобы избежать необходимости работать с фиксированной шириной поля
  3. Используйте lower () , чтобы обеспечить сравнение без учета регистра
  4. Используйте строку title () , чтобы первая буква каждого слова была заглавной для автора и названия книги

Refactored Code

while True:
  menu = input("1. Add a new book\n2. Search for a new book by a given author\n3. End\n")
  if menu in ('1', '2', '3'):
    menu = int(menu)
  else:
    print('Error -- Menu needs to be 1, 2, or 3')
    continue

  if menu == 1:
      author = input("Author: ")
      book = input("Book: ")
      price = input("Price: ")
      copies = input("Copies: ")

      line = '\t'.join([author.title(), book.title(), price, copies])
      with  open("BOOKS.txt","a") as books:
        print(line)
        books.write(line + "\n")

  elif menu == 2:
      author_search = input("Author name for search: ")
      if not author_search:
        print("Need author's name")
        continue  # quit on blank line for author

      author_search = author_search.lower()
      with open("BOOKS.txt","r") as books:
        found = False
        for line in books:
          # Will print all books by this author
          book_info = line.rstrip().split("\t")

          if author_search == book_info[0].lower(): # use lower to make case insensitive match
            found = True
            print('>>> Found Author')
            author, bookname, price, copies = book_info
            print(f'Author name: {author.title()}') # capitable firs letter of each name
            print(f'Book: {bookname.title()}')
            print(f'Price: {price}')
            print(f'Copies: {copies}')
        if not found:
          print('Author not found')
  else:
    break
...