copy netcdf file using python

拈花ヽ惹草 提交于 2019-12-19 09:03:30

问题


I would like to make a copy of netcdf file using Python.

There are very nice examples of how to read or write netcdf-file, but perhaps there is also a good way how to make the input and then output of the variables to another file.

A good-simple method would be nice, in order to get the dimensions and dimension variables to the output file with the lowest cost.


回答1:


I found the answer to this question at python netcdf: making a copy of all variables and attributes but one, but I needed to change it to work with my version of python/netCDF4 (Python 2.7.6/1.0.4). If you needed to add or subtract elements, you would make the appropriate modifications.

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')

This snippet has been tested.




回答2:


If you want to only use the netCDF-4 API to copy any netCDF-4 file, even those with variables that use arbitrary user-defined types, that's a difficult problem. The netCDF4 module at netcdf4-python.googlecode.com currently lacks support for compound types that have variable-length members or variable-length types of a compound base type, for example.

The nccopy utility that is available with the netCDF-4 C distribution shows it is possible to copy an arbitrary netCDF-4 file using only the C netCDF-4 API, but that's because the C API fully supports the netCDF-4 data model. If you limit your goal to copying netCDF-4 files that only use flat types supported by the googlecode module, the algorithm used in nccopy.c should work fine and should be well-suited to a more elegant implementation in Python.

A less ambitious project that would be even easier is a Python program that would copy any netCDF "classic format" file, because the classic model supported by netCDF-3 has no user-defined types or recursive types. This program would even work for netCDF-4 classic model files that also use performance features such as compression and chunking.




回答3:


Since I discovered xarray, this has been my go-to tool for everything python+netCDF related

You can easily copy a netcdf file, for example:

import xarray as xr

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



回答4:


see How do I copy a file in python?: a netcdf file is not different from any other file so it should fit your needs




回答5:


Just to clarify what I wanted back then.

I had to modify some variable, but I also wanted to keep the original file. So, now I would do this task either:

  • making a copy of the original file with different name via subprocess or some other way how to easily copy file in Python

  • make a new variable into the original file by opening the file in write mode

Nevertheless, Griffith,Russ and others are acknowledged for their answer to the problem.



来源:https://stackoverflow.com/questions/13936563/copy-netcdf-file-using-python

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!