使用python复制netcdf文件

时间:2012-12-18 15:47:38

标签: python netcdf

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

有很好的例子来说明如何读取或写入netcdf文件,但也许有一个很好的方法如何输入然后输出变量到另一个文件。

一个好的简单方法会很好,以便以最低的成本将尺寸和尺寸变量输出到输出文件。

6 个答案:

答案 0 :(得分:5)

如果您只想使用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经典模型文件。

答案 1 :(得分:5)

我在python netcdf: making a copy of all variables and attributes but one找到了这个问题的答案,但是我需要改变它以使用我的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')

此代码段已经过测试。

答案 2 :(得分:1)

自从我发现xarray以来,这一直是我处理与python + netCDF相关的所有事情的工具

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

import xarray as xr

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

答案 3 :(得分:1)

如果您使用的是Linux或macOS,则可以使用nctoolkit(https://nctoolkit.readthedocs.io/en/latest/installing.html)轻松实现。

@media (max-width: 600px){
    .wrapper {
        flex-direction: column;
        height: 100%; 
    }

   .wrapper .dropbtn{
        color: #336699;
        border: none;
        cursor: pointer;
        display: block;
        margin-bottom: 1px;
      }
    
    .wrapper .main_content .info{
        display: flex;
        flex-direction: column;
    }

    .wrapper .main_content .info .dropdown .dropdown-content{
        margin-bottom: auto;

    }

    .wrapper .main_content .social_media{
        position: relative;
        flex-direction: row;
        left: 48%;
    }
    .sidebar{
        display: none !important;
    }

    .wrapper .main_content{
        margin-left: 20px;
    }

    .wrapper .main_content .info {
        margin-left: 0px;
    }
}

答案 4 :(得分:-1)

请参阅How do I copy a file in python?:netcdf文件与其他任何文件都没有区别,因此它应符合您的需求

答案 5 :(得分:-1)

只是为了澄清我当时想要的。

我不得不修改一些变量,但我也想保留原始文件。因此,现在我将执行以下任务:

  • 通过子过程或其他方法轻松地在Python中复制文件,从而以不同的名称复制原始文件

  • 通过以写入模式打开文件将新变量创建到原始文件中

尽管如此,格里菲斯,鲁斯和其他人对这个问题的回答也得到认可。