要生成 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 :(得分: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))