首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在python中读取gzip netcdf文件?

如何在python中读取gzip netcdf文件?
EN

Stack Overflow用户
提问于 2014-12-05 18:18:44
回答 3查看 5.4K关注 0票数 8

我有一个可以工作的python程序,它使用Dataset命令从netCDF模块读取大量大型netCDF4文件。下面是相关部分的片段:

代码语言:javascript
运行
复制
from netCDF4 import Dataset
import glob

infile_root = 'start_of_file_name_'

for infile in sorted(glob.iglob(infile_root + '*')):
   ncin = Dataset(infile,'r')
   ncin.close()

我想要修改它,以读取在netCDF文件,是gzipped。文件本身在创建后被压缩;它们不是内部压缩的(即文件是*.nc.gz)。如果我在gzipped文本文件中阅读,命令如下:

代码语言:javascript
运行
复制
from netCDF4 import Dataset
import glob
import gzip

infile_root = 'start_of_file_name_'

for infile in sorted(glob.iglob(infile_root + '*.gz')):
   f = gzip.open(infile, 'rb')
   file_content = f.read()
   f.close()

在谷歌搜索了大约半个小时并阅读了netCDF4文档之后,我唯一能够为netCDF文件做这件事的方法是:

代码语言:javascript
运行
复制
from netCDF4 import Dataset
import glob
import os

infile_root = 'start_of_file_name_'

for infile in sorted(glob.iglob(infile_root + '*.gz')):
   os.system('gzip -d ' + infile)
   ncin = Dataset(infile[:-3],'r')
   ncin.close()
   os.system('gzip ' + infile[:-3]) 

是否可以直接使用Dataset命令读取gzip文件?或者不通过os调用gzip?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-05 22:24:44

因为NetCDF4-Python封装了C NetCDF4库,所以使用gzip模块传递类似文件的对象是不走运的。唯一的选择是,正如@tdelaney所建议的那样,使用gzip提取到临时文件。

如果您碰巧控制了这些文件的创建,NetCDF version 4文件在内部支持zlib压缩,因此使用gzip是多余的。如果您需要重复处理这些文件,也可能值得将这些文件从第3版转换到第4版。

票数 5
EN

Stack Overflow用户

发布于 2018-08-01 08:24:22

从内存读取数据集是支持的,因为netCDF4-1.2.8 (Changelog):

代码语言:javascript
运行
复制
import netCDF4
import gzip

with gzip.open('test.nc.gz') as gz:
    with netCDF4.Dataset('dummy', mode='r', memory=gz.read()) as nc:
        print(nc.variables)

参见memory参数在文档中的描述

票数 9
EN

Stack Overflow用户

发布于 2017-07-27 16:18:33

由于我只需要解决同样的问题,这里有一个现成的解决方案:

代码语言:javascript
运行
复制
import gzip
import os
import shutil
import tempfile

import netCDF4

def open_netcdf(fname):
    if fname.endswith(".gz"):
        infile = gzip.open(fname, 'rb')
        tmp = tempfile.NamedTemporaryFile(delete=False)
        shutil.copyfileobj(infile, tmp)
        infile.close()
        tmp.close()
        data = netCDF4.Dataset(tmp.name)
        os.unlink(tmp.name)
    else:
        data = netCDF4.Dataset(fname)
    return data
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27322248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档