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

csv.writer循环仅执行一次,定时API拉取数据无法写入CSV问题

问题分析与解决方案

咱们来拆解下你遇到的问题:单次运行正常,但定时执行时CSV写入失效、循环只跑一次,核心问题出在文件缓冲管理和定时触发逻辑上,一步步来解决:

1. CSV写入无响应:文件缓冲与句柄的坑

你在循环外部提前打开了CSV文件(c = open("file.csv", "a")),Python的文件默认会用缓冲机制——数据不会立刻写入磁盘,尤其是每分钟才写一次的场景,缓冲的内容可能一直攒在内存里,看起来就像“无法和文件交互”。另外长时间占用文件句柄,还可能触发系统的文件锁定,导致后续写入失败。

两种修复方案:

  • 方案一(推荐):每次写入时打开/关闭文件
    用with语句管理文件,它会自动帮你处理关闭和异常,彻底避免句柄泄漏和缓冲问题:
import csv
import time

while True:
    x = time.localtime()
    if x[5] == 0:
        client.request(r)
        print(i)
        # 每次执行写入时打开文件,写完自动关闭
        with open("file.csv", "a", newline="") as c:
            w = csv.writer(c, lineterminator="\n")
            for i in r.response["list"]:  # 注意这里要加冒号,你代码片段里漏了!
                w.writerow([i["list_item1"], i["list_item2"]])  # 补全你的字段
    time.sleep(1)  # 避免循环空转占CPU,每秒检查一次时间
  • 方案二:保留外部句柄,手动刷新缓冲
    如果不想每次都打开文件,就需要在写入后强制把缓冲刷到磁盘:
import csv
import time

with open("file.csv", "a", newline="") as c:
    w = csv.writer(c, lineterminator="\n")
    while True:
        x = time.localtime()
        if x[5] == 0:
            client.request(r)
            print(i)
            for i in r.response["list"]:
                w.writerow([i["list_item1"], i["list_item2"]])
            c.flush()  # 强制把内存里的缓冲数据写入磁盘
            time.sleep(59)  # 写完直接等59秒,避免同一分钟内重复触发
        time.sleep(1)

2. 循环仅执行一次:定时触发的逻辑漏洞

你的代码只判断x[5]==0,但如果代码执行速度快,可能在0秒的这一秒内多次进入判断;更可能的是,写入失败导致程序隐性报错中断,或者没有跳过剩余的0秒时间,导致后续循环因为阻塞停住。加上time.sleep(59)能确保每次执行后直接等下一分钟,既避免重复触发,也减少无效循环。

另外注意:你提供的代码片段里for i in r.response["list"]后面缺了冒号,这会直接触发语法错误,也是循环中断的潜在原因,一定要补上!

额外小提示

  • 测试时可以把x[5]==0改成x[5]%10==0(每10秒执行一次),不用等一分钟就能验证修复效果;
  • 如果用第三方HTTP客户端(比如requests),记得加异常捕获,避免API请求失败导致整个循环崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:52:54