You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python循环获取倒数第二个值遇文件仅输出单行问题求助

问题修复方案

核心问题分析

  1. 文件打开模式错误:每次调用main(rho_c)时,用"w"模式打开radial.out会清空文件原有内容,最终只保留最后一次调用的结果。
  2. 写入时机错误:当前代码仅在内部while P[-1] > 0循环结束后写入一次数据,而非每次循环迭代时提取并写入m和ar的倒数第二个值。
  3. 重复写入覆盖: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:10:26