-1

我编写了一个 python 脚本,它运行良好(见下文)。代码从不同的输入文件中读取行并尝试进行一些计算。输入文件如下所示:

Timestep 1000
Y TESFG
1.5
1.3
1.2
1.8
Timestep 1001
Y TESFG 1
1.0
1.0
1.0
1.2
Timestep 1002
Y TESFG 1
1.0
1.0
1.0
1.2

等等....

主输出文件(变量 sed)的格式相同,如下所示:

Timestep 1000
Y TESFG
1.0
1.0
1.0
1.0
Timestep 1001
Y TESFG 1
2.0
2.0
2.0
2.0
Timestep 1002
Y TESFG 1
1.0
1.0
1.0
1.2

我想在一个输出文件中对所有时间步长的变量“sed”求和。我使用 append 创建一个新列表并计算每一行的加法,但我的文件太大了,使用 append 需要太多时间。

您能否提供一些提示,如何将时间步下的每个数字彼此相加,以使结果如下所示:

Timestep all
Y TESFG 1
4.0
4.0
4.0
4.2


with open('a.dat', 'r') as v1, open('b.dat', 'r') as d2, open('st.dat','r') as st3 , 
open('v.dat','r') as A, open('sch.txt','w') as outfile,  open('pro.txt','w') as outfile2, 
open('Sed.txt','w') as outfile3, open('Sed.txt','w') as outfile4:
    for line1,line2,line3,line4 in zip(v1,d2,st3,A):
        try:
            line1 = line1.strip()
            line2 = line2.strip()
            line3 = line3.strip()
            line4 = line4.strip()
            column1 = line1.split()
            column2 = line2.split()
            column3 = line3.split()
            column4 = line4.split()
            v1 = float(column1[0])
            d2 = float(column2[0])
            if d2==0.00:
                d2=0.01
            st3 = float(column3[0])
            if st3 > 100:
                st3=100
            Sch = 1000*9.807*d2**(-1/3)*(v1)**2/(st3)**2
            p=1-(Sch/Sch_crit)
            if abs(p) > 1.0:
                p=1.0
            w_s=dm**2*9.807*(rou_s-rou_w)/(18*nou*rou_w)
            sed_rate=abs(p)*w_s*K
            area = float(column4[0])
            sed = sed_rate * 3600 *area
            print("{:.6f}".format(sediment), file=outfile4)
            print("{:.2f}".format(Schub), file=outfile)
            print("{:.2f}".format(abs(p)), file=outfile2)
            print("{:.6f}".format(sediment_rate), file=outfile3)
            #outfile.write("%.2f\t %.2f\n" % (vx,vy))
    except ValueError:
            print(line2, file=outfile4)
            print(line2, file=outfile)
            print(line2, file=outfile2)
            print(line2, file=outfile3)

*************************编辑***********************

摘要:我有这个输入文件

Timestep 1000
Y TESFG 1
1.0
1.0
1.0
1.0
Timestep 1001
Y TESFG 1
2.0
2.0
2.0
2.0
Timestep 1002
Y TESFG 1
1.0
1.0
1.0
1.2

我想得到这个:

Timestep all
Y TESFG 1
4.0
4.0
4.0
4.2

**************编辑*****************

这是我的第二个问题!

我想要一个累积数据输出,以便对于每个时间步,它检查数据的累积值以及它是否大于最大值。它停止添加该特定行。因此在上面的示例中,如果最大值为 3.0,则不会添加最后一个时间步,结果将是:

Timestep all
Y TESFG 1
3.0
3.0
3.0
3.0
4

1 回答 1

1

试试这个:

with open('input.txt') as fp:
    data = [float(line.strip()) for line in fp if line.strip().replace('.', '', 1).isdigit()]

mmax = 3.0
data = [data[i: i+4] for i in range(0, len(data), 4)]
res =  'Timestep all\nY TESFG 1\n' + '\n'.join([str(sum(x)) if sum(x) < mmax else str(mmax) for x in map(list, zip(*data))])
print(res)

输出:

Timestep all
Y TESFG 1
3.0
3.0
3.0
3.0
于 2020-05-19T10:01:36.310 回答