【发布时间】:2015-02-03 23:57:53
【问题描述】:
我有一个工作 python 程序,它使用来自 netCDF4 模块的 Dataset 命令读取许多大型 netCDF 文件。这是相关部分的sn-p:
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()
我想修改它以读入 gzip 压缩的 netCDF 文件。文件本身在创建后被压缩;它们不是内部压缩的(即文件是 *.nc.gz)。如果我正在阅读 gzip 压缩的文本文件,命令将是:
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 文件执行此操作的唯一方法是:
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?
【问题讨论】:
-
Dataset docs 没有指定任何关于 gz 文件的内容,所以我认为它不受支持。我确信有一种方法可以在没有
gzip系统调用的情况下从 Python 中压缩它们,但我不知道它会是什么。为什么需要Dataset来处理? -
我不想单独调用解压缩然后重新压缩文件。我也最想避免系统调用。
-
gzip.open返回一个类似文件的对象,可用于对文件进行只读访问 - 但看起来 netCDF4 不支持。如果是我,我会使用 python gzip 模块解压缩到一个临时文件并保留原始文件。如果它需要经常完成,您可以开始维护您已解压缩的缓存。如果文件被修改了,你无论如何都需要解压缩并重新压缩,这算什么。 -
@tdelaney - 谢谢。使用 gzip 模块解压缩到临时文件是一个很好的建议。