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

Python迭代中保留行值:如何实现序列条件下的文件写入?

解决思路:跟踪前一行的状态

这个问题的核心是在遍历行时保存上一行的I值,这样就能和当前行的I做对比了。我会帮你修改代码,同时优化一些细节(比如文件操作的最佳实践):

修改后的完整代码

# -*- coding: utf-8 -*-
import math

# 用with语句管理文件,自动关闭,避免手动close的疏漏
with open("COLLISON.txt", 'r') as f:
    linelist = f.readlines()

with open("All_Collisions_Raw_Data.txt", "w") as f2:
    for line in linelist:
        if 'Û' in line[0]:
            f2.write(line)

with open("Primary_Recoils_Raw_Data.txt", "w") as f3:
    for line in linelist:
        if 'Prime Recoil' in line:
            f3.write(line)

S = raw_input('Are you analysing a sphere?\n Y/n \n')
if S.lower() == 'y':  # 简化大小写判断,更简洁
    rad = float(input('What is the radius of the sphere in Angstroms? \n'))  # 转成float更合理
    with open('All_Collisions_in_sphere', 'w') as f14:
        prev_i = None  # 初始化前一行的I值,第一行没有前一行,设为None
        for line in linelist:
            if len(line) > 55 and 'Û' in line[0]:  # 合并两个判断,让代码更紧凑
                # 提取当前行的I并转成整数(原代码是字符串,直接比较会出错)
                current_i = int(line[6])
                # 保留你原本的r值计算逻辑
                Xa = float(''.join(line[25:29]))
                Xs = float(Xa - rad)
                Ya = float(''.join(line[36:40]))
                Za = float(''.join(line[47:51]))
                Xf = float(''.join(line[31:34]))
                Yf = float(''.join(line[42:45]))
                Zf = float(''.join(line[53:56]))
                Xf1 = 10 ** Xf
                Yf1 = 10 ** Yf
                Zf1 = 10 ** Zf
                Xd = Xs * Xf1
                Yd = Ya * Yf1
                Zd = Za * Zf1
                ra = Xd**2 + Yd**2 + Zd**2
                r = math.sqrt(ra)
                
                # 判断写入条件:I等于1,或者当前I等于前一行I+1,同时满足r<rad
                write_line = False
                if current_i == 1:
                    write_line = True
                elif prev_i is not None and current_i == prev_i + 1:
                    write_line = True
                
                if write_line and r < rad:
                    f14.write(line)
                
                # 不管当前行是否写入,都更新前一行的I为当前行的I(因为是物理上的前一行)
                prev_i = current_i

关键细节解释

  1. 跟踪前一行状态:用prev_i变量存储上一行的I值,每次循环结束后更新它,这样下一次迭代就能拿到前一行的数值做对比。
  2. 类型转换:把line[6]转成整数int(line[6]),避免字符串和整数比较的错误(比如'1' == 1在Python中是False)。
  3. 文件操作优化:用with语句打开文件,Python会自动处理文件关闭,避免因忘记调用close()或程序异常导致的文件未关闭问题。
  4. 简化逻辑:将S == 'Y' or S == 'y'改为S.lower() == 'y',合并len(line) >55和'Û' in line[0]的判断,让代码更简洁易读。

额外修复

原代码中f.close少了括号(应该是f.close()),不过用with语句后就不需要手动调用close()了,这也是Python推荐的文件操作写法。

内容的提问来源于stack exchange,提问作者J.Titor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:41:23