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

如何确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:25:16