Python循环获取倒数第二个值遇文件仅输出单行问题求助
问题修复方案
核心问题分析
- 文件打开模式错误:每次调用
main(rho_c)时,用"w"模式打开radial.out会清空文件原有内容,最终只保留最后一次调用的结果。 - 写入时机错误:当前代码仅在内部
while P[-1] > 0循环结束后写入一次数据,而非每次循环迭代时提取并写入m和ar的倒数第二个值。 - 重复写入覆盖:
f.write()之后调用np.savetxt()会再次覆盖文件内容,导致之前写入的内容丢失。
修改后的代码
import numpy as np import matplotlib.pyplot as plt def main(rho_c): # 使用"a"模式追加写入,避免清空文件 f = open("radial.out","a") ### Constants pi = 3.1415926535897 gamma =5./3. m_sun = 2.998e33 K = 1e10 P_c = K*rho_c**gamma km = 1e5 # cm dr = 1e4 # cm r = 0; Rho = np.zeros(2) Rho[0] = rho_c Rho[1] = rho_c ar = np.zeros(2) # Tum r degerleri array olarak buna atilacak ar[0] = r ar[1] = dr m = np.zeros(2) m_k1 = 0 m_k2 = 0 m_k3 = 0 m_k4 = 0 P = np.zeros(2) P_k1 = 0 P_k2 = 0 P_k3 = 0 P_k4 = 0 m[0] = 0 P[0] = P_c P[1] = P[0] m[1] = 4*pi*dr**3*rho_c/3 def der_m(r,m,ro): return 4.*np.pi*(r**2)*ro def ro(P): if P==P_c: return rho_c return (P/K)**(3./5.) def der_P(r,P,ro,m): G = 6.67430e-8 # Gravitational constant cm^3/(g*s)^ c = 2.998e+10 # cm/s return - (G*m*ro/(r**2))*(1.+(4.*np.pi*(r**3)*P/(m*c**2) ) )* \ (1. + P/(ro*c**2) )/(1-(2.*G*m/(r*c**2))) i = 1 r = r+i*dr while P[-1] > 0: # For m """ r , m , ro """ m_k1 = der_m( r , m[i] , ro(P[i]) ) m_k2 = der_m( r+0.5*dr , m[i]+dr*m_k1*0.5 , ro(P[i]) ) m_k3 = der_m( r+0.5*dr , m[i]+dr*m_k2*0.5 , ro(P[i]) ) m_k4 = der_m( r+1.*dr , m[i]+dr*m_k3 , ro(P[i]) ) m = np.append(m, m[i] + (dr/6.)*( m_k1+2.*m_k2+2.*m_k3+m_k4 ) ) # For P P_k1 = der_P(r , P[i] ,ro(P[i]) , m[i]) P_k2 = der_P(r+0.5*dr , P[i]+dr*P_k1*0.5 ,ro(P[i]+dr*P_k1*0.5) , m[i]+dr*m_k1*0.5) P_k3 = der_P(r+0.5*dr , P[i]+dr*P_k2*0.5 ,ro(P[i]+dr*P_k2*0.5) , m[i]+dr*m_k1*0.5) P_k4 = der_P(r+1.*dr , P[i]+dr*P_k3 ,ro(P[i]+dr*P_k3) , m[i]) P = np.append(P, P[i] + (dr/6.)*( P_k1+2.*P_k2+2.*P_k3+P_k4 ) ) r = r+dr ar = np.append(ar,r) Rho = np.append(Rho, ro(P[i]) ) i = i+1 # 每次循环迭代时提取并写入倒数第二个值 if len(m) >=2 and len(ar)>=2: ar_val = ar[-2]/km m_val = m[-2]/m_sun # 写入格式化的内容,方便后续读取 f.write(f"{ar_val} {m_val}\n") Hm = m[i]/np.abs(der_m(r,m[i],ro(P[i]))) Hp = P[i]/np.abs(der_P(r,P[i],ro(P[i]),m[i])) H = (Hm*Hp)/(Hm+Hp) dr = H plt.plot(ar/km,m/m_sun) plt.xlim([0, 13]) plt.ylim([0,1.035]) plt.xlabel(r'$R$ (km)') plt.ylabel(r'$M/M_\odot$') #plt.savefig('plot_mass.pdf') f.close() # 初始化文件,先清空原有内容(可选,根据需求) open("radial.out", "w").close() rho_c = 2e15 # Density centeral kg/me3 while rho_c < 2e16: #logspace main(rho_c) rho_c = rho_c*1.2
关键修改说明
- 文件打开模式:将
"w"改为"a",实现追加写入,避免每次调用main时清空文件。如果需要每次运行程序都重新生成文件,在循环调用main前先执行open("radial.out", "w").close()清空文件。 - 写入时机调整:将数据写入代码移到内部
while循环内,每次迭代完成后提取ar和m的倒数第二个值并写入文件。 - 移除重复写入:删除
np.savetxt调用,避免覆盖之前写入的内容,改用f.write直接写入格式化的文本行,更符合逐行记录的需求。
内容的提问来源于stack exchange,提问作者Trissa Shamp
相关产品推荐
相关产品推荐

