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
关键细节解释
- 跟踪前一行状态:用
prev_i变量存储上一行的I值,每次循环结束后更新它,这样下一次迭代就能拿到前一行的数值做对比。 - 类型转换:把
line[6]转成整数int(line[6]),避免字符串和整数比较的错误(比如'1' == 1在Python中是False)。 - 文件操作优化:用
with语句打开文件,Python会自动处理文件关闭,避免因忘记调用close()或程序异常导致的文件未关闭问题。 - 简化逻辑:将
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
相关产品推荐
相关产品推荐

