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
相关产品推荐
相关产品推荐

