我想使用 Python 制作 netcdf 文件的副本。
关于如何读取或写入 netcdf 文件有非常好的示例,但也许还有一种很好的方法是如何将变量输入然后输出到另一个文件。
一个简单的好方法会很好,以便以最低的成本将维度和维度变量获取到输出文件。
我在 python netcdf 找到了这个问题的答案:制作所有变量和属性的副本,但我需要更改它以使用我的 python/netCDF4 版本(Python 2.7.6/1.0.4)。如果您需要添加或减少元素,您将进行适当的修改。
import netCDF4 as nc
def create_file_from_source(src_file, trg_file):
src = nc.Dataset(src_file)
trg = nc.Dataset(trg_file, mode='w')
# Create the dimensions of the file
for name, dim in src.dimensions.items():
trg.createDimension(name, len(dim) if not dim.isunlimited() else None)
# Copy the global attributes
trg.setncatts({a:src.getncattr(a) for a in src.ncattrs()})
# Create the variables in the file
for name, var in src.variables.items():
trg.createVariable(name, var.dtype, var.dimensions)
# Copy the variable attributes
trg.variables[name].setncatts({a:var.getncattr(a) for a in var.ncattrs()})
# Copy the variables values (as 'f4' eventually)
trg.variables[name][:] = src.variables[name][:]
# Save the file
trg.close()
create_file_from_source('in.nc', 'out.nc')
这个片段已经过测试。
如果您只想使用 netCDF-4 API 来复制任何netCDF-4 文件,即使是那些带有使用任意用户定义类型的变量的文件,这是一个难题。例如,netcdf4-python.googlecode.com 上的 netCDF4 模块目前缺乏对具有可变长度成员或复合基类型的可变长度类型的复合类型的支持。
netCDF-4 C 发行版中提供的 nccopy 实用程序表明,可以仅使用 C netCDF-4 API 复制任意 netCDF-4 文件,但这是因为 C API 完全支持 netCDF-4 数据模型。如果您将目标限制为复制仅使用 googlecode 模块支持的平面类型的 netCDF-4 文件,则 nccopy.c 中使用的算法应该可以正常工作,并且应该非常适合 Python 中更优雅的实现。
一个不那么雄心勃勃但更容易的项目是一个 Python 程序,它可以复制任何 netCDF“经典格式”文件,因为 netCDF-3 支持的经典模型没有用户定义的类型或递归类型。该程序甚至适用于同样使用压缩和分块等性能特性的 netCDF-4 经典模型文件。
自从我发现xarray以来,这一直是我所有与 python+netCDF 相关的首选工具
您可以轻松复制 netcdf 文件,例如:
import xarray as xr
input = xr.open_dataset('ncfile.nc')
input.to_netcdf('copy_of_ncfile.nc')
如果您使用的是 Linux 或 macOS,则可以使用 nctoolkit ( https://nctoolkit.readthedocs.io/en/latest/installing.html ) 轻松实现。
import nctoolkit as nc
data = nc.open_data("infile.nc")
data.to_nc("outfile.nc")
请参阅如何在 python 中复制文件?: netcdf 文件与任何其他文件没有什么不同,因此它应该适合您的需要