Python比特币价格监控程序无法写入文本文件且无报错求助
首先来说你遇到的文件写入问题:这是Python文件缓冲机制导致的,并非write()函数本身的语法错误。
当你在with代码块里的无限循环中持续写入文件时,Python默认会把内容先存在内存缓冲区里,只有当缓冲区被填满、文件被关闭,或者你手动触发刷新时,才会把内容真正写入磁盘。而你的循环一直运行,文件始终处于打开状态,缓冲区没达到自动刷新的条件,所以你在磁盘上看不到写入的内容,但实际上数据暂时存在内存里。
快速修复方案
有两种简单的方法解决这个问题:
方法1:手动刷新缓冲区
在write()函数里写完内容后,调用f.flush()强制把内存中的内容写入磁盘:
def write(): global change nps = str(newPrice) + ' USD' writeThis = nps + ' ' + writeChange f.write(writeThis) f.write('\n') f.flush() # 关键:手动刷新缓冲区 print(writeThis)
方法2:启用行缓冲模式
打开文件时指定buffering=1,这样每次写入换行符\n时,Python会自动刷新缓冲区:
with open("bitcoinPrice.txt","w+", buffering=1) as f: while True: getCost() calcChange() write()
代码优化建议
作为Python新手,你的思路已经很清晰了,这里给你几个实用的优化方向,让代码更健壮、易维护:
告别全局变量:全局变量会让代码逻辑变得混乱,建议把
newPrice、writeChange作为参数传递给write()函数,比如:def write(new_price, change_text): nps = f"{new_price} USD" write_this = f"{nps} {change_text}" f.write(f"{write_this}\n") f.flush() print(write_this)调用时改成
write(newPrice, writeChange)即可。添加爬取延时:你提到要每5分钟爬一次,但当前代码没有任何延时,会疯狂请求目标网站,很容易被封禁IP。记得导入
time模块,在循环末尾加上time.sleep(300)(300秒=5分钟)。加入异常处理:网络请求、数据解析都可能失败,比如网站宕机、返回格式变化,用
try-except块捕获异常,避免程序直接崩溃:import time with open("bitcoinPrice.txt","w+", buffering=1) as f: while True: try: getCost() calcChange() write(newPrice, writeChange) except Exception as e: print(f"出错了:{e}") # 出错后可以适当延长等待时间,避免频繁重试 time.sleep(60) time.sleep(300)遵循PEP8命名规范:变量名用小写加下划线,比如
newPrice改成new_price,writeChange改成change_text,这样代码可读性更高。记录时间戳:每次写入价格时加上当前时间,方便后续查看历史数据,比如:
from datetime import datetime def write(new_price, change_text): current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") write_this = f"{current_time} - {new_price} USD {change_text}" f.write(f"{write_this}\n") f.flush() print(write_this)考虑追加模式:如果希望程序重启后保留之前的历史记录,把打开模式从
w+改成a+(追加模式),这样不会清空原有文件内容。
内容的提问来源于stack exchange,提问作者Gurnoor

