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

Python图书馆管理系统借书库存更新失败及批量替换问题求助

问题1 第二次借书找不到字符串的原因

你在borrow.py文件的全局作用域仅执行了一次读取books.txt生成list1的操作,该操作在模块导入时就已经运行完成。第一次借书成功修改磁盘文件的库存后,内存里的list1没有同步更新,所以第二次查询同一本书ID时,拿到的库存还是旧值,去已经更新过的磁盘文件里找旧的库存字符串自然会提示找不到。

问题2 全局替换导致同库存书籍被误改的原因

你当前使用的str.replace是全文匹配替换,只要文件里有和库存值相同的字符串,不管属于哪本书、在什么位置都会被替换。比如多本书库存都是8,修改其中一本的库存时所有的8都会被改掉,甚至如果书名、价格里有和库存相同的数字也会被误修改。

修复方案

不要做全局字符串替换,每次修改库存时重新读取整个文件,按行拆分找到对应ID的行,仅修改这一行的库存字段,再整体写回文件即可同时解决上述两个问题,修改后的代码如下:

1. 修改borrow.py(可删除原来单独的change模块)

def load_books():
    """每次操作前重新读取书籍文件,确保内存数据和磁盘一致"""
    with open('books.txt', 'r', encoding='utf-8') as f:
        return [line.strip().split(',') for line in f if line.strip()]

def save_books(book_list):
    """把修改后的书籍列表写回文件"""
    with open('books.txt', 'w', encoding='utf-8') as f:
        for book in book_list:
            f.write(','.join(book) + '\n')

def main_borrow():                   
    borrowerName = input("Enter your name: ").lower()
    bookID = input("Enter the required book ID: ")
    book_list = load_books()
    bookIDFound = False
    for idx, book in enumerate(book_list):
        if book[0] == bookID:
            bookIDFound = True
            print("The requested book is", book)
            # 写入借阅记录
            borrow_record = {borrowerName : book[1]}
            with open('borrowers.txt', 'a', encoding='utf-8') as f:
                f.write(repr(borrow_record) + '\n')
            # 仅修改当前书籍的库存
            old_stock = book[5]
            new_stock = str(int(old_stock) - 1)
            book_list[idx][5] = new_stock
            save_books(book_list)
            print(f"库存修改成功:{old_stock} -> {new_stock}")
            break
    if not bookIDFound:
        print("Enter a valid book ID: ")

2. 原主文件代码无需修改

修改完成后,每次借书都会读取最新的文件数据,且仅修改目标书籍的库存字段,不会影响其他数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:15:00