2016-06-28 56 views
0

一個Python要生成TECPLOT文件我用:撰寫格式發生器

import numpy as np 

x, y = np.genfromtxt('./files.dat', unpack=True) 
nb_value = x.size 
x_splitted = np.split(x, nb_value // 1000 + 1) 
y_splitted = np.split(y, nb_value // 1000 + 1) 

with open('./test.dat', 'w') as f: 
    f.write('TITLE = \" YOUPI \" \n') 
    f.write('VARIABLES = \"x\" \"Y\" \n') 
    f.write('ZONE T = \"zone1 \" , I=' + str(nb_value) + ', F=BLOCK \n') 
    for idx in range(len(x_splitted)): 
     string_list = ["%.7E" % val for val in x_splitted[idx]] 
     f.write('\t'.join(string_list)+'\n') 
    for idx in range(len(y_splitted)): 
     string_list = ["%.7E" % val for val in y_splitted[idx]] 
     f.write('\t'.join(string_list)+'\n') 

這裏是file.dat一個例子:

-6.491083147394967334e-02 6.917197804459292456e+02 
-6.489978349202699115e-02 6.871829941905543819e+02 
-6.481115367048655151e-02 6.707292800160890920e+02 
-6.479991205404790622e-02 6.756112033303363660e+02 
-6.471117816968344205e-02 7.666798999627604871e+02 
-6.469995628177811764e-02 7.819675271405360490e+02 

此代碼工作,但我已經看到了,我應該使用.format()而不是%。這是運行:string_list = ["{}".format(list(val for val in y_splitted[idx]))],但不會與Tecplot,因爲我們需要7E

如果我嘗試:string_list = ["{.7E}".format(list(val for val in y_splitted[idx]))]它根本不起作用。我得到了:AttributeError: 'list' object has no attribute '7E'

什麼是最好的方式來做我想做的事情?

+0

@freakish:看起來你誤會了'%.7E'確實在字符串格式化操作。 –

回答

2

格式化符來了:冒號後:

["{:.7E}".format(val) for val in y_splitted[idx]] 

注意,我必須調整你的列表中理解語法爲好;您只需要將各個val應用於str.format(),而不是整個循環。實質上,您只需要在此替換"%.7E" % val部件。

Format String Syntax documentation

replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}" 

演示:

>>> ["%.7E" % val for val in (2.8, 4.2e5)] 
['2.8000000E+00', '4.2000000E+05'] 
>>> ["{:.7E}".format(val) for val in (2.8, 4.2e5)] 
['2.8000000E+00', '4.2000000E+05'] 

不是說你真的需要使用str.format(),因爲有沒有其他部分的字符串;如果你已經是"{:<formatspec>}",只需使用format() function,並在<formatspec>通過作爲第二個參數:

[format(val, ".7E") for val in y_splitted[idx]] 

注意,在Python中,你一般不循環在range()然後使用索引來獲取列表值。就在列表循環直接

for xsplit in x_splitted: 
    string_list = [format(val, ".7E") for val in xsplit] 
    f.write('\t'.join(string_list) + '\n') 
for ysplit in y_splitted: 
    string_list = [format(val, ".7E") for val in ysplit] 
    f.write('\t'.join(string_list)+'\n') 

也沒有逃脫你的字符串中的字符";你只需要這樣做,當字符分隔符也是"字符;您正在使用'。您可以使用str.format()插入nb_value有太多:

f.write('TITLE = " YOUPI " \n') 
f.write('VARIABLES = "x" "Y" \n') 
f.write('ZONE T = "zone1 " , I={}, F=BLOCK \n'.format(nb_value)) 
+0

非常感謝Martijn!非常清楚和有益的答案。最後一件事,有人告訴我關於'map'的字符串列表,因爲它更高效,但我不明白如何在這裏使用說明符:'map(str(format ='%。7e',??),? ?)' – Y0da

+0

@ Y0da;你不能在這裏使用'map()';使用列表理解是更好的選擇。 –

+0

謝謝你了:) – Y0da