编写Python格式的生成器

时间:2016-06-28 08:17:38

标签: python io generator

要生成 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'

做我想做的最好的方法是什么?

1 个答案:

答案 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))