標籤:

Python3.讀取nc和hdf的套路

nc和hdf是一家人,5行Python代碼一鍋端

網上各種讀取nc和hdf格式的教程很多,我總結了一個簡單暴力、性價比相當高的套路,總共只要4~5行Python代碼(核心代碼只有2行),通吃netCDF3、netCDF4、hdf3、hdf4:

import netCDF4 as nc

filename = r"E:whatever.nc" # 也可以是hdf文件

with nc.Dataset(filename) as file:
file.set_auto_mask(False) # 可選
variables = {x: file[x][()] for x in file.variables}

最終nc或hdf中的所有變數以字典的形式存在variables中了。

演示環境:

  • python 3.7.2
  • netcdf4 1.4.2

假如要讀取hdf4格式的文件好像還要裝hdf4庫(我也記不得當時是自動安裝的還是手動安裝的了)。

講解

  • 這個套路依賴的主要是netCDF4的強大兼容性,在讀取過程中自動判斷文件的具體格式。
  • with語句會自動關閉打開的文件,省去手動調用關閉方法的一行代碼。
  • 最後一行中file.variables是類似字典的視圖,用在循環中遍歷的就是是文件中的變數名。
  • 最後一行中用字典解析式(有的教程里叫字典推導)壓縮了循環遍歷變數的代碼。
  • 最後一行中[()]獲取變數的值是我從h5py的使用中學的,之所以不用更常用的[:]是因為在h5py中如果變數是標量會報Illegal slicing argument for scalar dataspace的錯。雖然netCDF4中好像不存在這個問題,但是[()]體現了一種周全的思維,拿來用也不報錯。
  • 注釋可選的那一行如果去掉,讀出來的變數是numpyd的MaskedArray類型如下圖,和正常ndarray幾乎一樣只不過增加了對缺測值的表示。我習慣打開矩陣看到數值所以有這一句,如果喜歡讀出數據後用matplotlib.pyplot.imshow()迅速畫個圖看看的話可以把這一句去掉。

注意

  • filename文件路徑和文件名中不能有中文!而讀hdf5的h5py卻沒有這個毛病,真是令人費解。
  • 通常nc文件中除了variables還有dimensionsgroups,如果需要的話將最後一行中的file.variables對應改一下。不過目前我接觸到的文件中並沒有人把數據放到groups里(想像成nc文件里的文件夾),而dimensions基本都是讀文件前已知的,還是按需讀取吧。

netCDF4格式支持多個無限維度,當有大量矩陣形式的數據(具體數據量又未知)要存取時可以把nc文件當成一個簡易資料庫,這就涉及到netCDF4寫入操作了。下次再說~

喜歡的話請關注吧,天曉得還會更新什麼不好玩兒的東西:

推薦閱讀:

TAG:Python |