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

Python读取txt文件生成列表转换为Book对象实现图书库存管理

从books.txt文本行转换为Book类实例的实现方案

核心注意点

  • 从文本文件读取的所有内容默认均为字符串类型,其中库存总量、已借出数量两个字段需要参与借出、归还、库存统计等数值计算,必须在实例化阶段转为整数,否则后续运算会触发类型错误。
  • 拆分字段后建议增加空行跳过、字段数量校验逻辑,避免文件中存在误输入的空行、缺字段的坏行导致整个程序崩溃,这类容错处理在课程项目中会明显提升程序稳定性。
  • 只要拆分得到的字段顺序和Book类__init__方法的参数顺序完全一致(书名、作者、ISBN、索书号、库存总量、已借出数量),就可以用*列表名的方式直接解包传参,不需要逐个写索引取值,代码更简洁。

完整衔接代码

你已经完成了文件逐行读取、拆分、Book类定义三个部分,只需要补充字段校验、类型转换、实例追加三个步骤即可完成衔接,参考实现如下:

class Book:
    def __init__(self, title, author, isbn, callnumber, stock, loaned):
        self.title = title
        self.author = author
        self.isbn = isbn
        self.callnumber = callnumber
        # 数值字段转整数
        self.stock = int(stock)
        self.loaned = int(loaned)

    # 保留你已经编写完成的各属性getter方法即可
    def get_title(self):
        return self.title
    def get_author(self):
        return self.author
    def get_isbn(self):
        return self.isbn
    def get_callnumber(self):
        return self.callnumber
    def get_stock(self):
        return self.stock
    def get_loaned(self):
        return self.loaned

# 初始化存储所有图书对象的内存列表
books = []

# 读取文件并实例化对象
with open("books.txt", "r", encoding="utf-8") as f:
    for line in f:
        # 去除首尾空白字符
        line_content = line.strip()
        # 跳过文件中可能存在的空行,避免报错
        if not line_content:
            continue
        # 按分号拆分字段,这一步你已经实现
        fields = line_content.split(";")
        # 校验字段数量,跳过格式错误的坏行,避免程序崩溃
        if len(fields) != 6:
            print(f"跳过格式异常的行:{line_content}")
            continue
        # 拆分后的字段顺序与Book类构造参数顺序完全匹配,可直接解包传参
        book_obj = Book(*fields)
        # 将实例追加到内存列表
        books.append(book_obj)

效果验证

读取完成后可以通过简单测试确认对象生成正确:

# 打印第一本图书的可借库存,验证数值属性转换正常
if books:
    first_book = books[0]
    print(f"书名:{first_book.get_title()}")
    print(f"可借数量:{first_book.get_stock() - first_book.get_loaned()}")

配套保存逻辑参考

匹配你「用户主动选择才保存到文件」的需求,保存时遍历内存中的Book对象列表,按原格式拼接每行内容覆写回文件即可:

def save_to_file():
    with open("books.txt", "w", encoding="utf-8") as f:
        for book in books:
            # 按原分号分隔格式拼接每行内容
            write_line = f"{book.title};{book.author};{book.isbn};{book.callnumber};{book.stock};{book.loaned}\n"
            f.write(write_line)

内容的提问来源于stack exchange,提问作者JadronAU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:12:32