如何确保Python中convert_to_zip()在download()执行完成后运行?
解决方法
核心问题是**convert_to_zip()执行时,allitems.csv还没被download()完全写入磁盘**——哪怕看似按顺序调用,也可能因IO缓存、异步操作等原因导致文件未就绪。以下是几种可靠的处理方式:
1. 同步调用+文件校验(最通用)
如果download()是同步函数(比如用requests、urllib等同步网络库),直接按顺序调用,并在执行转换前校验文件是否存在且非空:
import os import zipfile import requests def download(): # 替换成你的实际爬取/下载逻辑 csv_url = "爬取到的csv文件地址" with open("allitems.csv", "wb") as f: # requests.get是同步阻塞的,会等下载完成再继续执行后续代码 f.write(requests.get(csv_url).content) def convert_to_zip(): with zipfile.ZipFile("allitems.zip", "w") as zip_f: zip_f.write("allitems.csv") # 正确调用流程 download() # 校验文件状态,避免下载失败导致转换报错 if os.path.exists("allitems.csv") and os.path.getsize("allitems.csv") > 0: convert_to_zip() else: print("错误:csv文件未下载成功或为空")
2. 异步场景下的等待处理
如果download()用了异步网络库(比如aiohttp),必须用await等待下载任务完全完成后再执行转换:
import asyncio import aiohttp import os import zipfile async def download(): async with aiohttp.ClientSession() as session: async with session.get("爬取到的csv文件地址") as resp: with open("allitems.csv", "wb") as f: f.write(await resp.read()) async def convert_to_zip(): with zipfile.ZipFile("allitems.zip", "w") as zip_f: zip_f.write("allitems.csv") async def main(): await download() # 强制等待下载完成 if os.path.exists("allitems.csv") and os.path.getsize("allitems.csv") > 0: await convert_to_zip() else: print("错误:csv文件未下载成功") asyncio.run(main())
3. 极端场景下的文件就绪轮询
如果遇到特殊IO缓存问题(比如文件已存在但内容还没完全写入磁盘),可以加个轮询等待文件状态稳定:
import time def wait_for_file_ready(file_path, timeout=30): start_time = time.time() while time.time() - start_time < timeout: if os.path.exists(file_path): # 检查文件大小是否连续两次读取一致(确认写入完成) size1 = os.path.getsize(file_path) time.sleep(0.1) size2 = os.path.getsize(file_path) if size1 == size2: return True time.sleep(0.5) return False # 调用时替换文件校验逻辑: download() if wait_for_file_ready("allitems.csv"): convert_to_zip() else: print("错误:文件超时未就绪")
内容的提问来源于stack exchange,提问作者Brio Tech
相关产品推荐
相关产品推荐

