Python无限循环从API取数写入文件后异常停止求助
我来帮你排查这个问题!这种程序看似正常运行但突然停止写入文件的情况,通常是几个容易被忽略的细节导致的,咱们一步步拆解解决:
最可能的原因:请求无超时导致挂起
你的requests.get没有设置超时时间,如果API服务器偶尔响应缓慢、网络出现隐性卡顿(比如TCP连接没正常断开),请求会一直卡在那里,程序看起来还在运行,但根本没走到写入文件的步骤。这是这类问题的头号元凶。
解决方法:给请求加上超时限制,比如设置10秒超时(可以根据你的API响应速度调整):
r = requests.get('https://someapiserver.com/data/', timeout=10)
隐藏的错误被宽泛的异常捕获掩盖
你用了except:捕获所有异常,而且只打印了模糊的error,这会掩盖很多实际问题——比如API返回了非JSON格式的数据导致r.json()失败、文件写入时的权限波动、甚至是内存小问题。你看不到具体错误,自然不知道程序卡在哪了。
解决方法:捕获具体异常并打印详细信息,方便排查:
import traceback # ... except Exception as e: print(f'[{time.strftime("%Y-%m-%d %H:%M:%S")}] 出错了:{str(e)}') traceback.print_exc() # 打印完整错误栈,能看到到底哪行出问题 time.sleep(10)
JSON对象直接写入的潜在问题
r.json()返回的是Python字典或列表对象,直接用f.write(line)会抛出TypeError(因为write只接受字符串)。你的简化代码可能漏了json.dumps()转换步骤?如果API偶尔返回不符合预期的JSON结构,解析失败后被except捕获,但你看不到具体错误,就会误以为程序“没报错但停了”。
解决方法:把JSON对象转成字符串再写入,最好加个换行符方便后续查看:
line = json.dumps(r.json()) + '\n' with open('file.txt', 'a') as f: f.write(line)
可选优化:强制刷新文件缓冲
虽然with块结束会自动关闭文件并刷新缓冲,但Windows系统下偶尔会有系统级缓冲延迟,导致内容没立刻写到磁盘上,看起来像是“停止写入”。可以手动强制刷新:
with open('file.txt', 'a') as f: f.write(line) f.flush() # 强制把内存里的内容写到磁盘
优化后的完整代码
把这些调整整合起来,代码会更健壮:
import requests, json, time, traceback while True: try: # 带超时的请求,避免挂起 r = requests.get('https://someapiserver.com/data/', timeout=10) # 检查HTTP状态码,4xx/5xx直接抛出异常 r.raise_for_status() # 转换JSON为字符串并添加换行 line = json.dumps(r.json()) + '\n' # 打开文件时指定编码,避免乱码 with open('file.txt', 'a', encoding='utf-8') as f: f.write(line) f.flush() time.sleep(5) except Exception as e: # 打印带时间戳的详细错误 print(f'[{time.strftime("%Y-%m-%d %H:%M:%S")}] 错误详情:{str(e)}') traceback.print_exc() time.sleep(10)
建议你运行修改后的程序时,盯着控制台输出,看看有没有错误信息——大概率能找到之前“停写”的原因。
内容的提问来源于stack exchange,提问作者Zdenko Brzic

