1.在《通達(dá)信-功能-公式系統(tǒng)-自定義數(shù)據(jù)管理器》中可以手工添加數(shù)據(jù),并導(dǎo)出為txt文本,但手工只能添加幾個(gè),多了就費(fèi)勁了。
2.在任意行情列表頁上,執(zhí)行《系統(tǒng)-數(shù)據(jù)導(dǎo)出》可以將幾千條數(shù)據(jù)導(dǎo)出為txt文本,
于是決定用第2步數(shù)據(jù)來更新第1步的數(shù)據(jù),代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #encoding=utf-8
import re
# read file
dic={}
pattern= "([0-9]{6})\s+([\u4e00-\u9fa5]+)\s+(-?[0-9]+\.[0-9]*|-?[0-9]+)\s+(-?[0-9]+\.[0-9]*|-?[0-9]+)\s+(-?[0-9]+\.[0-9]*|-?[0-9]+)\s+(-?[0-9]+\.[0-9]*|-?[0-9]+)\s+(-?[0-9]+\.[0-9]*|-?[0-9]+)\s+(-?[0-9]+\.[0-9]*|-?[0-9]+)"
with open(r 'D:\new_hrzq_v6\T0002\export\滬深A股.txt' ) as infile:
for line in infile:
list=re.findall(pattern,line)
if len(list)>0:
code=list[0][0]
name=list[0][7]
dic[code]=name
# concat lines
sn=0
lines= ""
for code,name in dic.items():
if str(code)[0]== "6" :
sn=1
else :
sn=0
line=str(sn)+ "|" +code+ "|" +name+ "|" +str( "0.000" )+ "\n"
lines=lines+line
# write file
with open(r 'D:\new_hrzq_v6\外部數(shù)據(jù)(字符串,數(shù)值)_1.txt' , 'w' ) as outfile:
outfile.write(lines)
print( "ok" )
|
3.導(dǎo)出的自定義數(shù)據(jù)怎么用呢?答:在《行情報(bào)價(jià) 的標(biāo)題欄上點(diǎn)鼠標(biāo)右鍵-選擇自定義數(shù)據(jù)》,就可將相應(yīng)的“自定義數(shù)據(jù)”顯示在行情報(bào)價(jià)列表中了。
上述代碼在使用過程中發(fā)現(xiàn)有bug,原因是有的股票名稱中有空格,還有*ST 、A 、TCL、GYQ、N、-U、-UW、-WD等文字,代碼中的正則表達(dá)式不能正確匹配,需要改一下正則表達(dá)式。
后來用pandas重寫,在讀xls時(shí)遇到編碼問題,用read_csv read_html openpyxl xlrd ,加上參數(shù)cp936 gb18030 utf-8-sig utf16LE等等統(tǒng)統(tǒng)不好使。
原因似乎是由于程序生成的xls實(shí)際是csv,且格式不規(guī)則,但是用wps顯示正常?搞不明白具體原因!
最終采取逐行讀文件解析,倒是簡單:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #encoding=utf-8
import pandas as pd
from io import StringIO
path1 = r "滬深A股.xls"
path2 = r "外部數(shù)據(jù)(字符串,數(shù)值)_1.txt"
listdf = []
f= open(path1, 'r' )
next(f)
next(f)
for line in f:
linearr = line.strip().split( '\t' )
if (len(linearr))>7:
listrow = [linearr[0].strip( "=" ).strip( "\"" ),linearr[7]]
listdf.append(listrow)
f.close()
df=pd.DataFrame(data=listdf,columns=[ '1' , '2' ])
df.insert(loc=0, column= '0' , value= "0" )
df[ '0' ]=df[ '1' ].apply(lambda x:1 if x[0]== "6" else 0)
df.insert(loc=3, column= '3' , value= "0.000" )
print(df.shape)
print(df.iloc[0:3])
df.to_csv(path2,sep= '|' ,header=0,index=0)
|
生成兩個(gè)文件的版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #encoding=utf-8
import pandas as pd
from io import StringIO
path1 = r "滬深A股.xls"
path2 = r "外部數(shù)據(jù)(字符串,數(shù)值)_1.txt"
path3 = r "外部數(shù)據(jù)(字符串,數(shù)值)_2.txt"
#需要第幾列,從0開始數(shù)
mycolA = 8
mycolB = 9
listdf = []
f= open(path1, 'r' )
next(f)
next(f)
for line in f:
linearr = line.strip().split( '\t' )
if (len(linearr))>mycolB:
#保留代碼列、相應(yīng)參數(shù)列
listrow = [linearr[0].strip( "=" ).strip( "\"" ),linearr[mycolA],linearr[mycolB]]
listdf.append(listrow)
f.close()
df=pd.DataFrame(data=listdf,columns=[ '1' , '2' , '3' ])
df.insert(loc=0, column= '0' , value= "0" )
df.insert(loc=0, column= '4' , value= "0.000" )
df[ '0' ]=df[ '1' ].apply(lambda x:1 if x[0]== "6" else 0)
#選子集
df2=df[[ "0" , "1" , "2" , "4" ]]
df3=df[[ "0" , "1" , "3" , "4" ]]
#print(df.shape)
#print(df.iloc[0:3])
#增加分隔符并保存
df2.to_csv(path2,sep= '|' ,header=0,index=0)
df3.to_csv(path3,sep= '|' ,header=0,index=0)
print( "ok" )
|
參考:https://www.cnblogs.com/pyhy/p/16698107.html
|