У меня есть работающая программа на Python, которая считывает несколько больших файлов netCDF с помощью команды Dataset из модуля netCDF4. Вот фрагмент соответствующих частей:
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, которые сжаты gzip. Сами файлы были сжаты после создания; они не сжаты внутри (т. е. файлы имеют формат *.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])
Можно ли напрямую читать файлы gzip с помощью команды Dataset? Или без вызова gzip через os?
gzip
, но я не знаю, что это будет. Зачем вам нужно, чтобы он обрабатывался Dataset? - person Spencer Hill   schedule 05.12.2014gzip.open
возвращает файлоподобный объект, который можно использовать для доступа к файлу только для чтения, но похоже, что netCDF4 этого не поддерживает. Если бы это был я, я бы использовал модуль python gzip, чтобы разархивировать во временный файл и оставить оригинал в покое. Если это нужно делать часто, вы можете начать поддерживать кеш тех файлов, которые вы разархивировали. Если файлы изменены, вам все равно нужно распаковать и снова заархивировать, так что, черт возьми. - person tdelaney   schedule 05.12.2014