Python处理NetCDF数据遇类型错误:需字符串却传入Field对象
解决NetCDF数据处理时的TypeError问题
我一眼就看出问题所在啦——你给DataFieldForOHstarSimulation类传错参数了!
错误根源
scipy.io.netcdf.netcdf_file()这个函数要求传入文件路径的字符串,但你现在传进去的是Field和Grid的实例对象(就是你创建的solutionField和grid),不是文件路径字符串,这就导致Python没法把对象转换成函数需要的Unicode字符串,所以抛出了TypeError: coercing to Unicode: need string or buffer, Field found这个错误。
两种解决思路
根据你的代码逻辑,分两种情况来处理:
情况1:你需要保留Field和Grid的实例
如果Field和Grid类本身是用来封装NetCDF文件操作的,那你要从这两个实例里取出对应的文件路径,或者直接复用已经打开的NetCDF文件对象:
- 假设
Field类里保存了文件路径(比如有个filename属性),或者已经打开了NetCDF文件对象(比如netcdf_file属性),那修改DataFieldForOHstarSimulation的构造函数:
要是class DataFieldForOHstarSimulation(object): def __init__(self, solution_field_obj, grid_field_obj, use_precomputed_values=True): # 如果Field类已经打开了文件,直接复用 self.solution_netcdf_file = solution_field_obj.netcdf_file self.vars = self.solution_netcdf_file.vars # Grid类同理 self.grid_netcdf_file = grid_field_obj.netcdf_file # 后面的代码保持不变...Field只保存了文件路径,那就改成:self.solution_netcdf_file = sp.io.netcdf.netcdf_file(solution_field_obj.filename)
情况2:你不需要Field和Grid的实例
如果这两个类是多余的,直接把文件路径字符串传给DataFieldForOHstarSimulation就行,删掉中间的实例化步骤:
# 直接传文件路径,不用先创建Field和Grid对象 dataField = DataFieldForOHstarSimulation(solution_file, grid_file, use_precomputed_values=use_precomputed_values)
额外提示
建议先去看一下Field和Grid类的实现代码,搞清楚它们到底是用来做什么的——如果是封装了NetCDF的读取逻辑,那复用它们已经打开的文件对象会更高效,避免重复打开文件哦。
内容的提问来源于stack exchange,提问作者Federica Tonti
相关产品推荐
相关产品推荐

