Python 从许多文件中添加数字而不使用太多内存



我写了一个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

等等....

主输出文件 (varaible 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("%.2ft %.2fn" % (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

试试这个:

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 allnY TESFG 1n' + '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

相关内容

  • 没有找到相关文章

最新更新