Python读取snap快照报无文件、ifile未定义错误求助
故障原因
两个报错都是代码逻辑疏漏导致,和路径配置本身无关:
ifile is not defined:构造snaps_folder时引用了ifile变量,但代码中从未定义该变量,也没有编写遍历sl00、sl01...目录的外层循环。首次运行成功是因为交互环境(Jupyter/IPython/命令行临时会话)中残留了之前手动赋值的ifile,会话重启/变量清空后就会触发报错。no such file or directory由三个问题共同触发:- 上述
ifile未定义导致路径拼接结果完全错误,指向不存在的目录 - 循环变量名不一致:for循环定义的变量是
isnaps,但读取文件时格式化用的是isnap,会直接取到残留的错误值,拼出错误的snap文件名 - 读取snap时只传了文件名,没有传文件所在的完整绝对路径:
os.listdir仅返回文件名不包含路径,当脚本运行的工作目录和snap存储目录不一致时,程序会在错误的位置找文件。
- 上述
- 额外隐藏bug:代码缺少遍历所有slxx目录的外层循环,即使不报错也只能处理单个sl目录下的snap,和你多目录存储的数据结构不匹配;另外代码中用到的
H0、单位量u没有显式定义,也会在变量清空后触发报错。
修正后的可运行代码
import os import numpy as np from astropy import units as u # 提前导入自定义的readsnap函数即可 # 基础路径配置 IC_folder = r'C:\Users\Desktop\ICs' base_snaps_root = r'C:\Users\Desktop\outputs_all' # slxx文件夹的上级目录 H0 = 70 * u.km / u.s / u.Mpc # 按你的实际哈勃常数值调整,原代码漏了该变量定义 h = 0.7 # 遍历所有sl开头的目录,ifile从0开始对应sl00、sl01、sl02... nfiles = len(os.listdir(IC_folder)) for ifile in range(nfiles): # 用os.path.join拼接路径,避免跨平台/转义导致的路径错误 snaps_folder = os.path.join(base_snaps_root, 'sl%02d' % ifile) # 校验目录存在性,跳过缺失目录避免崩溃 if not os.path.exists(snaps_folder): print(f"跳过不存在的目录: {snaps_folder}") continue # 过滤目录中非snap的冗余文件 snaps = [f for f in os.listdir(snaps_folder) if f.startswith('snap_')] nsnaps = len(snaps) # 统一循环变量名为isnap,和后续文件名格式化的变量名保持一致 for isnap in range(nsnaps): # 构造snap文件的完整绝对路径,不要仅传文件名 snap_path = os.path.join(snaps_folder, "snap_%03d" % isnap) if not os.path.exists(snap_path): print(f"跳过不存在的snap文件: {snap_path}") continue # 读取snap数据 tMyr, radius, nHp, nHep, nHepp, temp , redshift , overden, veloc, omegaM, omegaL, gH0, nH0, ngrid, h100, omegab = readsnap(snap_path) current_a=1./(redshift+1) # 单位转换 vel=(veloc*u.km/u.s).to(u.cm/u.s) rad=(((radius/((1+redshift)))/h)*u.kiloparsec).to(u.cm) # 计算哈勃参数和速度 a_dot = np.sqrt(omegaM/current_a + omegaL*current_a**2 )*H0 H_z = a_dot / current_a v_H=rad*H_z v_i=v_H + vel # 后续自定义处理逻辑写在此处
避坑提示
- Windows系统下写raw格式路径时,不要写双反斜杠:
r'C:\Users\Desktop\xxx'即可,raw前缀会自动处理转义,写双反斜杠反而会生成带两个反斜杠的错误路径。 - 不要依赖运行环境的残留变量,所有用到的变量必须在脚本中显式赋值,避免会话重启后出现未定义错误。
- 所有文件读取操作尽量传入拼接好的绝对路径,不要依赖IDE/终端的默认工作目录——不同运行环境的默认工作路径经常和脚本所在路径不一致,是触发文件找不到错误的高频原因。
- 可以在路径拼接后加
os.path.exists()校验,提前跳过缺失的目录/文件,避免程序运行中途崩溃。
内容的提问来源于stack exchange,提问作者Orionebula
相关产品推荐
相关产品推荐

