A:当并发任务执行结果返回的结果集格式是一样时,可以将所有结果导出到一个表中。
实现方法参考如下:
方法一:
将第一个包含列名的结果集导出后再导出其它不含列名的结果集;
方法二:
将所有结果集在python合并后导出包含列名的结果集,适用于数量较小的的情况。
pyTSL开启并发任务:FAQ:
Q:pyTSL接口中如何并发执行多个天软任务
其它导出数据说明:FAQ:
Q:python如何把天软数据分批导入到本地
实现范例
范例一:逐个结果导出到csv文件
python代码:
import pyTSL
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
if c.login() :
print("登陆成功")
else:
print("登陆失败:",c.login(),c.last_error())
test = '''
function get_value(stock);
begin
Setsysparam(pn_cycle(),cy_1m()); //设置高频数据的周期
begt:=20240312t;
endt:=20240312.1600t;
return select *,datetimetostr(["date"]) as "date"
from markettable datekey begt to endt of stock end;
end;
'''
stocks = ['SH600000','SH600004','SH600006','SH600007']
batch=pyTSL.Batch(4)#设置4个并发数,用户可根据账号并发资源合理控制
for s in stocks:
t=batch.call(c, "get_value", s, code=test,key=s)
path="C:\\Users\\86152\\Desktop\\markettable.csv"
it=iter(batch)
first=next(it) #取第一个结果
df=first.dataframe()
df.to_csv(path,index=False,header=True,encoding="gbk")#导出结果带列名
for data in it: #取剩下的结果
df = data.dataframe()
df.to_csv(path,mode="a",index=False,header=False,encoding="gbk")#导出结果新增再文件末尾不带列名
执行结果:数据文件成功导出到本地
范例二:合并取数结果导出到csv文件
python代码
import pandas as pd
import pyTSL
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
if c.login() :
print("登陆成功")
else:
print("登陆失败:",c.login(),c.last_error())
test = '''
function get_value(stock);
begin
Setsysparam(pn_cycle(),cy_1m()); //设置高频数据的周期
begt:=20240312t;
endt:=20240312.1600t;
return select *,datetimetostr(["date"]) as "date"
from markettable datekey begt to endt of stock end;
end;
'''
stocks = ['SH600000','SH600004','SH600006','SH600007']
batch=pyTSL.Batch(4)#设置4个并发数,用户可根据账号并发资源合理控制
for s in stocks:
t=batch.call(c, "get_value", s, code=test,key=s)
df=pd.DataFrame()
for data in iter(batch):
df=pd.concat([df,data.dataframe()],axis=0)#合并结果
path="C:\\Users\\86152\\Desktop\\markettable.csv"
df.to_csv(path,index=False,header=True,encoding="gbk")#导出结果带列名
执行结果:数据已导出
范例三:逐个结果导出到txt文件
python代码
import pyTSL
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
if c.login() :
print("登陆成功")
else:
print("登陆失败:",c.login(),c.last_error())
test = '''
function get_value(stock);
begin
Setsysparam(pn_cycle(),cy_1m()); //设置高频数据的周期
begt:=20240312t;
endt:=20240312.1600t;
return select *,datetimetostr(["date"]) as "date"
from markettable datekey begt to endt of stock end;
end;
'''
stocks = ['SH600000','SH600004','SH600006','SH600007']
batch=pyTSL.Batch(4)#设置4个并发数,用户可根据账号并发资源合理控制
for s in stocks:
t=batch.call(c, "get_value", s, code=test,key=s)
path="C:\\Users\\86152\\Desktop\\test.txt"
it=iter(batch)
first=next(it).value()#取第一个结果
with open(path,"w") as file:
line=','.join([key for key in first[0].keys()])#第一个结果集写入列名到首行
file.write(line + '\n')
for row in first:
line = ','.join([str(row[key]) for key in row.keys()])
file.write(line + '\n')
for data in it:
for row in data.value():
line = ','.join([str(row[key]) for key in row.keys()])
file.write(line + '\n')
file.close()
执行结果:数据文件成功导出到本地
范例四:合并结果导出到txt文件
python代码
import pyTSL
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
if c.login() :
print("登陆成功")
else:
print("登陆失败:",c.login(),c.last_error())
test = '''
function get_value(stock);
begin
Setsysparam(pn_cycle(),cy_1m()); //设置高频数据的周期
begt:=20240312t;
endt:=20240312.1600t;
return select *,datetimetostr(["date"]) as "date"
from markettable datekey begt to endt of stock end;
end;
'''
stocks = ['SH600000','SH600004','SH600006','SH600007']
batch=pyTSL.Batch(4)#设置4个并发数,用户可根据账号并发资源合理控制
for s in stocks:
t=batch.call(c, "get_value", s, code=test,key=s)
path="C:\\Users\\86152\\Desktop\\test.txt"
data=[]
for t in iter(batch):
data+=(t.value())#数据合并
with open(path,"w") as file:
line=','.join([key for key in data[0].keys()])#第一行写入列名
file.write(line + '\n')
for row in data:
line = ','.join([str(row[key]) for key in row.keys()])
file.write(line + '\n')
file.close()
执行结果:合并结果已导出