如何从文本文件中打印字符串,在Python中用新行分隔

如何从文本文件中打印字符串,在Python中用新行分隔,python,Python,我是Python新手,我正在挑战自己,通过在线图书馆管理和第一阶段的提示。我在搜索功能中积累。我已经找到了如何打印用户输入,但我找不到如何打印和以下数据。我想按名称搜索一本书。如果书的名称在文本中,我想打印该书的详细信息,比如作者、isbn等 以下是我编写的代码: def search(): search_book = input('Search a book: ') with open('library.txt', mode='r', encoding='utf-8') a

我是Python新手,我正在挑战自己,通过在线图书馆管理和第一阶段的提示。我在搜索功能中积累。我已经找到了如何打印用户输入,但我找不到如何打印和以下数据。我想按名称搜索一本书。如果书的名称在文本中,我想打印该书的详细信息,比如作者、isbn等

以下是我编写的代码:

 def search():
    search_book = input('Search a book: ')

    with open('library.txt', mode='r', encoding='utf-8') as f:
        index = 0
        for line in f:
            index += 1
            if search_book in line:
                print(f'{search_book} is in line {index}')
                for details in range(index,index+5):
                    print(line[details])
这是文本文件的数据:

FIRST
ME 
9781234
2000
Science

SECOND
YOU
9791234
1980
Literature
它由新行分隔。例如,用户首先输入名称,结果为:

FIRST
ME 
9781234
2000
Science

你一次读一行,循环第一行的内容。在程序的这一点上,还没有任何额外的行。但修复相对容易:

def search():
search_book=input('搜索一本书:')
将open('library.txt',mode='r',encoding='utf-8')作为f:
索引=0
打印此数量=0
对于f中的行:
指数+=1
如果在行中搜索图书:
打印(f'{search_book}在{index}行中)
打印此数量=5
如果要打印多个:
打印(行,结束=“”)
打印此\u多个-=1
我们的记忆中还没有下一行,但我们可以在继续阅读时记住要打印多少行。
print\u this\u many
变量用于此:当我们看到想要的标题时,我们将其设置为5(以指定此行和接下来的四行应该打印)。现在,每次我们读新行,我们检查这个变量是否为正;如果是,则打印该行并减小变量。当它达到零时,我们将不再打印以下行。这使我们能够“记住”跨< <代码> > <代码>循环,它读取每个新行,无论我们处于打印的中间位置。

一个更好的解决方案是将数据库读入内存一次,然后将行组织到字典中

def read_lib(文件名):
library=dict()
将打开(文件名)作为库:
标题=无
信息=[]
对于库中的行:
line=line.rstrip('\n')
如果标题为“无”:
标题=行
elif行=='':
如果标题和信息:
库[标题]=信息
标题=无
其他:
信息追加(行)
def搜索(标题、库):
如果图书馆中有标题:
返回库[标题]
其他:
一无所获
def main():
my_library=read_lib('library.txt'))
尽管如此:
sequed=输入('搜索书籍:')
查找=搜索(查找,我的库)
如果发现:
打印('\n'.join(已找到))
其他:
打印('对不起,库中没有这样的标题')

<代码> > p>有两个文件选项我们可以考虑,

  • Csv文件-您可以使用一行作为一个图书条目,而不是单独的阅读行
  • Json-这是比csv文件更好的选择

  • 如果您的文件内容无法更改,那么我将使用上面的@tripleee建议。祝你好运。

    你的问题是什么?你可以改为使用
    lines=f.readlines()
    ,然后在该数组中使用索引。比如:
    对于范围(0,len(行,5)中的行数:…
    您能更具体地说明什么在工作,什么不在工作吗?我没有尝试您的代码,但我认为最后一行应该是打印(f.readline())但不是100%确定。你也可以考虑使用JSON文件而不是文本文件。它是有效的。如果你解释PrtutTythSype的思想,我会很感激。很多不同之处不是很明显吗?我补充了一个简短的解释。
       # ---------test.csv -------------
       # BookName, ItemCode, Price 
       # Book1, 00012, 14.55
       # Book2, 00232, 55.12
       # -----End Csv-------------------
       import csv 
       def read_csv(filename:str):
          file_contents = None
          # reading csv file 
          with open(filename, 'r') as csvfile: 
             file_contents = csv.reader(csvfile)
          return file_contents
        
        def search(file_contents, book_name:str):
           if not file_contents:
             return None
           for line in file_contents:
             if book_name in line: 
                return line
        
         if __name__ == '__main__':
           file_contents = read_csv('test.csv')
           line = search(file_contents, 'ME')
           print(line if line else 'No Hit Found')
    
    import json
    def read_json(filename:str) -> dict:
       with open(filename) as json_file:
          all_books = json.load(json_file)
       return all_books
    
     def search(all_books:dict, book_name:str):
       for book_id, book_details in all_books.items():
          if book_details['Name'] == book_name:
             return book_details
       return None
     
     if __name__ == '__main__':
        all_books = read_json('books.json')
        book = search(all_books, 'YOU')
        print(book if book else 'Not hit found')