Python网络爬虫与Excel房价处理代码执行顺序问题:后续函数无法读取前序函数修改的Excel文件内容
看起来核心问题出在函数之间没有共享同一个Excel工作簿内存对象,或者部分函数在操作时重新从磁盘读取了原始文件,导致看不到前面函数的修改。Python的普通函数调用默认是同步执行的,所以“等待前一个函数完成”其实不是核心矛盾,真正要解决的是让所有函数操作同一个内存里的工作簿,而不是反复读写磁盘。
具体修复步骤:
1. 统一工作簿对象,避免重复读取磁盘
把工作簿对象作为参数传递给每个函数,而不是让函数各自打开文件。比如修改你的main函数和各个子函数:
def main(): # 先一次性打开工作簿,后续所有函数都操作这个内存对象 wb = openpyxl.load_workbook('prices.xlsx') # 按你实际使用的Excel库调整,比如xlwt/xlrd等 delete_empty_rows(wb, 'A') scraping_base(wb, column_data(wb, 'F')) # 注意column_data也要接收wb参数 weeks(wb) cities(wb) price_and_age(wb) status(wb) # 最后统一保存到磁盘 wb.save('prices.xlsx') wb.close() # 记得关闭工作簿释放资源
然后修改每个子函数,让它们接收wb参数,直接操作内存中的工作簿:
def delete_empty_rows(wb, column): ws = wb.active # 或者指定你要操作的具体工作表 # 你的删除空行逻辑,直接对ws对象进行修改
这样所有函数都操作同一个内存里的工作簿,前面的修改会立即反映在后续函数的操作中,完全不需要依赖磁盘文件的更新。
2. 排查函数内部的重复读文件逻辑
如果你的某个函数里又重新执行了类似openpyxl.load_workbook('prices.xlsx')的代码,那它读取的必然是磁盘上的旧版本(因为你最后才执行save),这就会导致读取旧数据。务必把所有这类重复读取的逻辑去掉,统一使用main里传入的wb对象。
3. 异步场景的特殊处理(如果涉及)
如果你的爬虫部分用了异步库(比如aiohttp),那需要确保爬虫函数完全执行完毕再进入后续步骤。比如如果scraping_base是异步函数,你需要用await调用或者用asyncio.run()包裹主逻辑:
import asyncio async def main(): wb = openpyxl.load_workbook('prices.xlsx') delete_empty_rows(wb, 'A') await scraping_base(wb, column_data(wb, 'F')) # 异步函数前加await weeks(wb) # ... 其他函数调用 wb.save('prices.xlsx') wb.close() asyncio.run(main())
但从你的代码结构来看,大概率是同步代码,所以重点还是工作簿对象的共享。
总结
核心就是让所有操作都基于同一个内存中的Excel工作簿对象,不要在函数里重复读取磁盘文件。这样前面函数的修改会直接在内存中生效,后续函数自然就能读到最新的内容,同时Python的同步函数调用会自动等待前一个函数执行完再往下走。
内容的提问来源于stack exchange,提问作者BalazsL

