Python新手程序问题:打印TXT内容仅输出大括号且流程异常
问题分析与修复方案
问题1:打印文件内容仅输出大括号
原因:
- 每次添加书籍时使用固定键
'New book',新书籍会直接覆盖旧条目,永远只保留最后一本。 - 保存文件时用追加模式写入整个字典字符串,导致文件中存在多个独立的字典结构(比如两行
{'New book': ...}),ast.literal_eval无法解析这种格式,触发异常后初始化空字典{},所以打印时仅显示大括号。 - 用户输入的
[Author, Title]是纯字符串,未转换为结构化数据,仅作为值存储。
修复:
- 将
books改为列表存储多本书籍,每本书用字典存储author和title字段。 - 保存文件时使用覆盖模式写入整个书籍列表,确保文件中只有一个合法的Python字面量。
- 解析用户输入的书籍信息,将字符串格式的
[作者, 书名]转换为实际的字典结构。
问题2:选择不添加书籍后,无论是否查看都会跳转到结束
原因:
原代码中,选择No后输入Yes查看书籍,打印后虽会回到主循环,但逻辑不够清晰,且加载文件失败时会初始化空字典,容易让用户误以为程序直接结束。另外,查看后没有明确的继续/退出选项,导致交互体验不佳。
修复:
优化No分支逻辑,查看书籍后增加继续操作或直接退出的选项,同时完善文件加载的异常处理,避免不必要的空字典初始化。
修复后的完整代码
import ast file_name = 'books.txt' def save_book(books_list, filename): # 覆盖写入整个书籍列表,确保文件结构合法 with open(filename, 'w') as f: f.write(str(books_list)) def load_book(filename): try: with open(filename, 'r') as f: content = f.read().strip() # 处理空文件或内容为空的情况 return ast.literal_eval(content) if content else [] except (FileNotFoundError, SyntaxError): # 文件不存在或解析失败时返回空列表 return [] # 初始化书籍列表 books = load_book(file_name) if not books: print('Creating a new library...') else: print('Library so far: ', books) while True: user_input = input('\nWould you like to add a book to your library? Yes / No >> ') if user_input.strip().lower() == 'yes': book_input = input('Please enter: [Author full name, Book Title] >> ') try: # 解析输入格式,提取作者和书名 book_info = book_input.strip().strip('[]').split(',', 1) author = book_info[0].strip() title = book_info[1].strip() books.append({"author": author, "title": title}) save_book(books, file_name) print(f'Book added: {title} by {author}') except IndexError: print('Invalid input format. Please use [Author, Book Title]') elif user_input.strip().lower() == 'no': view_choice = input('Would you like to view your books so far? Yes / No >> ') if view_choice.strip().lower() == 'yes': if books: print('Your library:') for idx, book in enumerate(books, 1): print(f'{idx}. {book["title"]} - {book["author"]}') else: print('Your library is empty.') # 查看后询问是否继续操作 continue_choice = input('Would you like to continue? Yes / No >> ') if continue_choice.strip().lower() != 'yes': print('OK, Have a nice day :) ') break elif view_choice.strip().lower() == 'no': print('OK, Have a nice day :) ') break else: print('Unknown command...') else: print('Unknown command...')
关键改进点
- 用列表存储多本书籍,彻底解决条目覆盖问题。
- 覆盖式写入文件,保证文件结构合法,能被
ast.literal_eval正确解析。 - 解析用户输入为结构化字典,便于后续展示和管理。
- 优化交互逻辑,查看书籍后提供明确的继续/退出选项,避免用户误解。
- 增加异常处理,覆盖文件不存在、输入格式错误等场景。
内容的提问来源于stack exchange,提问作者Thomas Coates
相关产品推荐
相关产品推荐

