如何将JAKMain.py输出的实时流数据写入pandas DataFrame?
问题解答
现有修改方案的问题
你目前的修改方案无法实现需求,存在三个核心问题:
- 你写的
printresult = result['Data'][i], end=""存在语法错误,end是print()函数的专属参数,变量赋值不支持该写法,运行会直接报错 - JAKMain.py中的
while True是死循环,你直接from JAKMain import *的时候,代码会直接卡在JAKMain的无限循环里,根本拿不到printresult变量,也没办法执行后续DataFrame相关逻辑 - 即使你修正语法,循环里每次赋值都会覆盖上一次的
printresult值,你也拿不到完整的100条批次数据
可行实现方案
优先推荐第一种方案,逻辑最简单,没有额外依赖:
方案1:直接在JAKMain.py中整合DataFrame写入逻辑
不需要拆分两个文件,直接在原有采集代码里维护DataFrame即可,示例代码如下:
import time import pandas as pd import api_con # 你原来的api依赖 # 初始化空DataFrame,列名和你字典的key对应,可按需加更多字段 df = pd.DataFrame(columns=['DDDD', '采集时间']) while True: time.sleep(3) result = api_con.AWS10000() collect_time = time.strftime('%H:%M:%S') print(collect_time) # 直接取前100条数据,无需写循环判断,更简洁 batch_data = result['Data'][:100] # 批次数据转临时DataFrame,追加采集时间戳 temp_df = pd.DataFrame(batch_data) temp_df['采集时间'] = collect_time # 合并到全局DataFrame中 df = pd.concat([df, temp_df], ignore_index=True) # 这里可按需添加自定义操作,比如打印最新数据、存储到文件等 print(f"当前DataFrame总条数:{len(df)}")
提示:如果数据采集长期运行,内存中DataFrame会越来越大,建议根据数据量定期将df写入本地文件(比如csv、parquet)并清空内存df,避免内存溢出。
方案2:分离采集和处理逻辑(如果必须拆成两个文件)
把JAKMain的采集逻辑改成生成器函数,不要把死循环写在顶层,然后在处理脚本里迭代生成器拿数据:
JAKMain.py修改后代码:
import time import api_con def get_realtime_data(): while True: time.sleep(3) result = api_con.AWS10000() collect_time = time.strftime('%H:%M:%S') print(collect_time) # 一次返回整批100条数据和对应采集时间 yield result['Data'][:100], collect_time
处理脚本代码:
import pandas as pd from JAKMain import get_realtime_data # 初始化空DataFrame df = pd.DataFrame(columns=['DDDD', '采集时间']) # 迭代生成器拿实时数据 for batch_data, collect_time in get_realtime_data(): temp_df = pd.DataFrame(batch_data) temp_df['采集时间'] = collect_time df = pd.concat([df, temp_df], ignore_index=True) # 按需添加其他处理逻辑 print(df.tail(5)) # 可打印最新5条数据验证效果
内容的提问来源于stack exchange,提问作者yodoro
相关产品推荐
相关产品推荐

