Python3 Spyder中Xarray循环加载NetCDF文件重复加载首个文件问题
问题:循环加载NetCDF文件时重复加载同一数据集
我需要加载本地挂载的远程服务器上的NetCDF文件(对应IMOS的SST日数据集),用xarray将这些文件存入列表,但遇到了奇怪的问题:每次循环迭代都只加载第一个文件,最终列表里全是同一个数据集。单独加载不同路径的文件也得到相同结果,可file_paths_on_server里的路径明明是不同的。
我的循环加载代码:
# 'file_paths_on_server' below is a list of file paths # load in data data = [] for n in range(len(file_paths_on_server)): ds = xr.open_dataset(file_paths_on_server[n], cache=False).load(); data.append(ds) ds.close()
单独测试的代码:
a = xr.open_dataset(file_paths_on_server[0], cache=False).load() b = xr.open_dataset(file_paths_on_server[1], cache=False).load()
结果a和b是同一个文件的数据集。
我的环境版本:
xarray 2022.11.0 netCDF4 1.5.7 Spyder 5.1.5 Python 3.9.7 64-bit Qt 5.9.7 PyQt5 5.9.2 Windows 10
怀疑是Spyder、Python或xarray的缓存问题,该怎么解决?
解决方案
1. 彻底禁用缓存并显式复制数据集
你已经加了cache=False,但可能还需要禁用netCDF4的磁盘缓存,同时显式复制数据集避免引用复用:
import xarray as xr # 全局禁用xarray的文件缓存 xr.set_options(file_cache_maxsize=0) data = [] for path in file_paths_on_server: # 打开文件时同时禁用diskcache ds = xr.open_dataset(path, cache=False, diskcache=False).load() # 显式复制数据集,防止后续操作影响已存入列表的内容 data.append(ds.copy()) ds.close()
2. 验证文件路径的实际指向
虽然你说路径不同,但挂载的远程路径可能实际指向了同一个文件。可以打印每个路径的文件属性来验证:
import os for path in file_paths_on_server: print(f"路径: {path}") print(f"文件大小: {os.path.getsize(path)} 字节") print(f"最后修改时间: {os.path.getmtime(path)}") print("---")
如果这些属性完全一致,说明挂载配置有问题,需要检查远程挂载的映射规则。
3. 排查Spyder的变量缓存问题
Spyder的变量查看器偶尔会出现缓存不更新的情况,导致显示内容和实际变量不符。可以尝试:
- 关闭Spyder后重新打开,再运行代码
- 在代码中添加打印语句,输出每个数据集的唯一标识(比如时间范围),确认实际加载的内容:
data = [] for path in file_paths_on_server: ds = xr.open_dataset(path, cache=False).load() print(f"已加载文件: {path}") print(f"数据集时间范围: {ds.time.min().values} 至 {ds.time.max().values}") data.append(ds) ds.close()
4. 更新依赖版本
你使用的xarray版本是2022.11.0,属于较旧版本,可能存在缓存相关的已知bug。建议更新到最新稳定版:
pip install --upgrade xarray netCDF4
内容的提问来源于stack exchange,提问作者UpperEastSide
相关产品推荐
相关产品推荐

