使用python复制netcdf文件

使用python复制netcdf文件,python,netcdf,Python,Netcdf,我想使用Python制作netcdf文件的副本 关于如何读取或写入netcdf文件,有很多很好的例子,但也许还有一种很好的方法,可以输入变量,然后将变量输出到另一个文件 为了以最低的成本将维度和维度变量获取到输出文件中,一个好的简单方法是很好的。请参阅:netcdf文件与任何其他文件没有区别,因此它应该适合您的需要如果您只想使用netcdf-4 API复制任何netcdf-4文件,即使是那些使用任意用户定义类型的变量,这也是一个困难的问题。例如,netCDF4-python.googlecode

我想使用Python制作netcdf文件的副本

关于如何读取或写入netcdf文件,有很多很好的例子,但也许还有一种很好的方法,可以输入变量,然后将变量输出到另一个文件


为了以最低的成本将维度和维度变量获取到输出文件中,一个好的简单方法是很好的。

请参阅:netcdf文件与任何其他文件没有区别,因此它应该适合您的需要

如果您只想使用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经典模型文件,这些文件还使用压缩和分块等性能特性。

我在上找到了这个问题的答案,但我需要将其更改为与我的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')
这段代码已经过测试。

自从我发现它以来,它一直是我的工具,适用于与python+netCDF相关的所有内容

您可以轻松复制netcdf文件,例如:

import xarray as xr

input = xr.open_dataset('ncfile.nc')
input.to_netcdf('copy_of_ncfile.nc')

如果您使用的是Linux或macOS,则可以使用nctoolkit()轻松实现这一点


我正在尝试使用模块netCDF4。不,我的意思是,你在试图解决这个问题时尝试了什么?在你发布这篇文章之前,你做了什么研究?我试图在stackoverflow和web上找到一个解决方案。结果是什么?这里的人不会只为你工作。在你的问题中,你需要展示你为了让它工作而尝试过的代码或方法。在来这里寻求帮助之前,您需要向我们表明您已经用尽了所有选项。OP希望将格式的一个版本复制到另一个版本,这与文件的副本非常不同。更不用说OpenDAP…@EliS OP指定他需要一种简单的方法来复制(而不是压缩、块、转换)netcdf文件,而不是OpenDAP url。其他一切都只是猜测。
import nctoolkit as nc
data = nc.open_data("infile.nc")
data.to_nc("outfile.nc")