You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:27:09