こんなファイルを読みたい。
本当はnumpyのloadtxtでdtypeを指定する (or 読みたい列だけ読む) のが賢い気は果てしなくする。
data=map(lambda str:str.split(), open("FeDist_Screened.plt").readlines())
とはいえ、これはメンドくさすぎると感じるのは自分だけ?dtypeどうにかならんのか。 dtype=('f8','f8','S16')とかダメなのか...。
data=np.loadtxt('FeDist_Screened.plt', delimiter=' ', usecols=[0,2,11],skiprows=1,dtype={'names':('l','6.4','id'), 'formats':('f8','f8','S16')})
一応やりたかったことをやってみた結果。awkだと瞬間なんだけど...。
SCRIPT_TYPE="InstrumentalityOfMankind"
SCRIPT_SHELL="python"
SCRIPT_NAME="make_Data.py"
SCRIPT_HELP_ARG=""
SCRIPT_HELP_SENTENCE=""
SCRIPT_NUM_ARG=0
SCRIPT_VERSION=1.0
###IMPORT###
import sys
###HELP###
if len(sys.argv[1:])!=SCRIPT_NUM_ARG:
print 'Name: '+SCRIPT_NAME
print 'Arguments: '+SCRIPT_HELP_ARG
print 'Explanation: '+SCRIPT_HELP_SENTENCE
sys.exit()
###MAIN###
infile="FeDist_Screened.plt"
data=map(lambda str:str.split(), open("FeDist_Screened.plt","r").readlines())
f=1/(3.14*18**2)
enes=['6.4','6.7']
for ene in enes :
if ene=="6.4" :
line_num=2
elif ene=="6.7" :
line_num=5
outname='Fe'+ene+'Dist_GRXE.txt'
line_emin_num=line_num+1
line_emax_num=line_num+2
outfile=open(outname,"w")
for data_row in data[1:] :
if float(data_row[0])**2>10**2:
l,b=data_row[0:2]
ids=data_row[11]+' '+data_row[12]
val, val_min, val_max=map(float,data_row[line_num:line_num+3])
val=f*val
val_err=f*(val_max-val_min)*0.5/1.64
out_str=l+' '+b+' '+str(val)+' '+str(val_err)+' '+ids+'\n'
outfile.write(out_str)
outfile.close()
書き込む前にstrにするのとかが果てしなく面倒くさい。
結論 : awkで良いじゃん (ヲイ) or 適材適所。