netcdf4-python 模塊詳解

2021-03-02 氣象雜貨鋪

python中提供了多種方式來處理netcdf文件,這裡主要講一下常用的 netcdf4-python 模塊。

netcdf4-python是 netCDF4 C庫的python模塊。新版本(V4)的 netcdf 中有很多以前版本中沒有的優點,而且新版本是在 HDF5 上建立的。此模塊可以讀寫 netCDF4 及 netCDF3 格式的文件,同時也可創建 HDF5 客戶端只讀的文件。

netCDF4 格式的許多特徵都實現了,比如:多個無限維度(groups)及zlib數據壓縮。除此之外,所有新的數據類型(64-bit 和 無符號整型)也已實現。同時也支持複數(struct),變長枚舉等數據類型,但不支持 opaque 數據類型,同時也不支持複數,變長型和枚舉型數據的組合,比如複數數據中包含枚舉型數據,或是變長類型數據中包含複數數據。

創建,打開和關閉 netCDF 文件

通過調用 Dataset 構造器可以創建 netCDF 文件,同時也可以用來打開已存在的文件。當然也可以執行寫入操作,可以寫入包括維度,組,變量和屬性的數據類型。

netCDF文件包含五種類型的數據,即 NETCDF3_CLASSIC,NETCDF3_64BIT_OFFSET, NETCDF3_64BIT_DATA, NETCDF4_CLASSIC,NETCDF4.

NETCDF3_CLASSIC 是原始的netcdf二進位文件,此格式文件大小不能超過 2 G;V3.6版本庫引入了 NETCDF3_64BIT_OFFSET 格式,從而使其大小可以超過 2 G;NETCDF3_64BIT_DATA 是V4.4.0版本庫引入的,其擴展了NETCDF3_64BIT_OFFSET 格式,從而可以支持無符號64位整型數據及64位維度大小;NETCDF3_64BITNETCDF3_64BIT_OFFSET 格式的別名;NETCDF4_CLASSIC 使用了V4磁碟格式(HDF5),但是忽略了V3 API 中沒有的特徵。只有當重新連結 netcdf 庫時,才可以通過 netCDF3 客戶端讀取,同時也可以通過HDF5客戶端讀取。

netCDF4 模塊可以讀取和寫入上述格式中的文件。當創建文件時,可以通過 Dataset 構造器的 format 關鍵詞參數指定格式。默認的格式是 NETCDF4。通過查看 data_model 屬性可以確定文件的格式。通過 Dataset 實例的 close 方法可以關閉已經打開的 netcdf 文件。

>>> from netCDF4 import Dataset
>>> rootgrp = Dataset("test.nc", "w", format="NETCDF4")
>>> print rootgrp.data_model
NETCDF4
>>> rootgrp.close()

如果使用 url 代替傳給 Dataset 構造器的文件名,那麼就可以獲取遠程數據集了。前提是支持獲取遠程數據功能。

netcdf 文件中的 Groups 

版本4的 netcdf 支持按層級來劃分數據,這類似文件系統中的目錄。Groups 可以包含變量,維度和屬性,同時也可以包含其他 groups。Dataset 回創建一個特殊的組,即 root group,類似unix文件系統中的根目錄。通過 Dataset 或 Group 實例的 createGroup 方法可以創建 Group 實例。createGroup 方法接受一個包含組名的 python 字符串。通過Dataset 實例的 groups 目錄屬性可以獲取包含在 root group 中的新 Group 實例的信息。註:只有 NETCDF4 格式文件支持 Groups,使用其他格式創建Group時會報錯。

>>> rootgrp = Dataset("test.nc", "a")
>>> fcstgrp = rootgrp.createGroup("forecasts")
>>> analgrp = rootgrp.createGroup("analyses")
>>> print rootgrp.groups
OrderedDict([("forecasts",
             <netCDF4._netCDF4.Group object at 0x1b4b7b0>),
            ("analyses",
             <netCDF4._netCDF4.Group object at 0x1b4b970>)])

組是可以進行嵌套的,也就是說一個組可以包含其他組,這就像unix文件系統的目錄下可以包含其他目錄一樣。每一個Group都包含一個 groups 屬性字典,其中包含了該組中包含的所有組實例。同樣,每一個組實例都包含了path屬性,指明了group所處的 」路徑「(類似unix文件系統中路徑)。為了簡化創建嵌套組的方式,可以傳遞類似unix文件系統中路徑的方式給 createGroup 方法:

>>> fcstgrp1 = rootgrp.createGroup("/forecasts/model1")
>>> fcstgrp2 = rootgrp.createGroup("/forecasts/model2")

如果路徑中不存在其他中間元素的話,創建組時就像在unix系統中使用 mkdir -p 命令創建路徑一樣。如果你試著創建已存在的組的話,不會導致錯誤,只會返回已存在的組。

下面是一個瀏覽 Dataset 中所有組的例子。函數 walktree 是一個生成器函數,用來遍歷目錄樹。注意所列印出的組信息。

>>> def walktree(top):
>>>    values = top.groups.values()
>>>    yield values
>>>    for value in top.groups.values():
>>>        for children in walktree(value):
>>>            yield children
>>> print rootgrp
>>> for children in walktree(rootgrp):
>>>     for child in children:
>>>         print child
<type "netCDF4._netCDF4.Dataset">
root group (NETCDF4 file format):
   dimensions:
   variables:
   groups: forecasts, analyses

netcdf 文件中的維度

netcdf根據維度信息創建所有變量的大小,所以在創建變量之前必須要創建維度信息。對於標量變量來說,不需要維度信息。Dateset 或 Group 實例的 createDimension 方法可以用以創建一個維度,傳遞給此方法的 python 字符串和整數用來表示維度的名稱和大小。如果要創建無限維度(即可以隨時添加數據),可以將大小設置為 None0

下例中, time 和 level 都是無限維變量。可以包含多個無限維變量是netcdf 的一個新特徵,之前的netcdf僅支持包含一個無限維變量,而且必須要包含在最左邊,即第一個維度。

>>> level = rootgrp.createDimension("level", None)
>>> time = rootgrp.createDimension("time", None)
>>> lat = rootgrp.createDimension("lat", 73)
>>> lon = rootgrp.createDimension("lon", 144)

所有的 Dimension 實例都被存儲在一個 python 字典中。

>>> print rootgrp.dimensions
OrderedDict([("level", <netCDF4._netCDF4.Dimension object at 0x1b48030>),
            ("time", <netCDF4._netCDF4.Dimension object at 0x1b481c0>),
            ("lat", <netCDF4._netCDF4.Dimension object at 0x1b480f8>),
            ("lon", <netCDF4._netCDF4.Dimension object at 0x1b48a08>)])

對 Dimension 實例執行 len 函數可以獲取此維度的大小,Dimension 實例的 isunlimited 方法可以確定維度是不是無限維。

>>> print len(lon)
144
>>> print lon.isunlimited()
False
>>> print time.isunlimited()
True

直接列印 Dimension 對象獲取更多有用信息,比如維度的名稱,大小以及是否是無限維等。

>>> for dimobj in rootgrp.dimensions.values():
>>>   print dimobj
<type "netCDF4._netCDF4.Dimension"> (unlimited): name = "level", size = 0
<type "netCDF4._netCDF4.Dimension"> (unlimited): name = "time", size = 0
<type "netCDF4._netCDF4.Dimension">: name = "lat", size = 73
<type "netCDF4._netCDF4.Dimension">: name = "lon", size = 144
<type "netCDF4._netCDF4.Dimension"> (unlimited): name = "time", size = 0

通過 Dataset 或 Group 實例的 netCDF4.Datatset.renameDimension 方法可以改變維度的名稱。 

netcdf 中的變量

netcdf 中的變量就像 numpy 模塊中的 python 多維數組。然而,不像 numpy 數組,可以在一個或多個無限維添加netcdf 變量。

使用 Dataset 或 Group 實例的 createVariable 方法可以創建一個 netcdf 變量。createVariable 方法需要至少傳遞兩個參數(變量名,變量數據類型)。通過包含變量名的元組確定變量的維度。如果要創建標量變量,只需要忽略維度關鍵詞即可。

變量的數據類型和 numpy 數據的類型是一致的。你可以指定數據類型為 numpy dtype 對象,或是可以轉換為numpy dtype 對象的任何東西。

有效的數據類型包括:

f4 : 32位浮點數

f8 : 64位浮點數

i/u4 : 32位有/無符號整型

i/u2 : 16位有/無符號整型

i/u8 : 64位有/無符號整型

i/u1 : 8位有/無符號整型

舊的單字符代碼 (f, d, h, s, b, B, c, i, l) 分別表示 (f4, f8, i2, i2, i1, i1, S1, i4, i4),這種設置方式仍然有效。如果文件格式是 NETCDF4, 無符號整型和64位整型可以使用。

維度本身也可以被定義為變量,稱為 坐標變量

createVariable 方法會返回一個 Variable 類實例,可以通過其方法獲取和設置變量數據及屬性。

>>> times = rootgrp.createVariable("time","f8",("time",))
>>> levels = rootgrp.createVariable("level","i4",("level",))
>>> latitudes = rootgrp.createVariable("lat","f4",("lat",))
>>> longitudes = rootgrp.createVariable("lon","f4",("lon",))
>>>
>>> temp = rootgrp.createVariable("temp","f4",("time","level","lat","lon",))

在交互時可以直接列印變量的所有信息:

>>> print temp
<type "netCDF4._netCDF4.Variable">
float32 temp(time, level, lat, lon)
   least_significant_digit: 3
   units: K
unlimited dimensions: time, level
current shape = (0, 0, 73, 144)

當然也可以直接在組的層級結構中通過路徑的方式創建變量:

>>> ftemp = rootgrp.createVariable("/forecasts/model1/temp","f4",("time","level","lat","lon",))

如果中間某個組不存在的話,會直接創建,而不會引起錯誤。

你可以通過指定 Group 或 Variable 實例的路徑來查詢 Group 或 Dataset 實例。

>>> print rootgrp["/forecasts/model1"]
<type "netCDF4._netCDF4.Group">
group /forecasts/model1:
   dimensions(sizes):
   variables(dimensions): float32 temp(time,level,lat,lon)
   groups:
>>> print rootgrp["/forecasts/model1/temp"]
<type "netCDF4._netCDF4.Variable">
float32 temp(time, level, lat, lon)
path = /forecasts/model1
unlimited dimensions: time, level
current shape = (0, 0, 73, 144)
filling on, default _FillValue of 9.96920996839e+36 used

Dataset 或 Group 都會存儲在 python 字典中,存儲方式和 維度 相同。

>>> print rootgrp.variables
OrderedDict([("time", <netCDF4.Variable object at 0x1b4ba70>),
            ("level", <netCDF4.Variable object at 0x1b4bab0>),
            ("lat", <netCDF4.Variable object at 0x1b4baf0>),
            ("lon", <netCDF4.Variable object at 0x1b4bb30>),
            ("temp", <netCDF4.Variable object at 0x1b4bb70>)])

變量名可以通過 Dataset 實例的 renameVariable 方法更改。

netcdf 文件中的屬性

netcdf 文件中包含了兩種類型的屬性:全局屬性變量屬性。前者提供的是組或整個數據集的信息,後者提供的是組中變量的信息。

指定值給Dataset 或 Group 實例變量可以設置 全局屬性,而位 Variable 實例變量賦值可以設置變量屬性。屬性可以是字符串,數字或序列。

>>> import time
>>> rootgrp.description = "bogus example script"
>>> rootgrp.history = "Created " + time.ctime(time.time())
>>> rootgrp.source = "netCDF4 python module tutorial"
>>> latitudes.units = "degrees north"
>>> longitudes.units = "degrees east"
>>> levels.units = "hPa"
>>> temp.units = "K"
>>> times.units = "hours since 0001-01-01 00:00:00.0"
>>> times.calendar = "gregorian"

Dateset,Group,Variable的 ncattrs 方法可以獲取所有 netcdf 屬性的名稱。使用python 內置的 dir 函數可以返回一些列私有方法和屬性(用戶不能或不應該更改)。

>>> for name in rootgrp.ncattrs():
>>>    print "Global attr", name, "=", getattr(rootgrp,name)
Global attr description = bogus example script
Global attr history = Created Mon Nov  7 10.30:56 2005
Global attr source = netCDF4 python module tutorial

Dataset,Group,Variable 實例的 __dict__ 屬性將所有的 netcdf 屬性名/值對存儲在python字典中。

>>> print rootgrp.__dict__
OrderedDict([(u"description", u"bogus example script"),
            (u"history", u"Created Thu Mar  3 19:30:33 2011"),
            (u"source", u"netCDF4 python module tutorial")])

使用 del 命令可以刪除 Dataset,Group,Variable 的屬性。

寫或讀取netcdf變量數據

現在創建了Variable 實例,那麼如何寫入數據呢?你可以將其視為一個數組,然後傳遞數據給一個切片即可。

>>> import numpy
>>> lats =  numpy.arange(-90,91,2.5)
>>> lons =  numpy.arange(-180,180,2.5)
>>> latitudes[:] = lats
>>> longitudes[:] = lons

與 numpy 數組對象不同的是,如果你在當前定義的索引範圍外賦值,那麼無限維變量將會沿著這些維度自動擴展

>>>
>>> nlats = len(rootgrp.dimensions["lat"])
>>> nlons = len(rootgrp.dimensions["lon"])
>>> print "temp shape before adding data = ",temp.shape
temp shape before adding data =  (0, 0, 73, 144)
>>>
>>> from numpy.random import uniform
>>> temp[0:5,0:10,:,:] = uniform(size=(5,10,nlats,nlons))
>>> print "temp shape after adding data = ",temp.shape
temp shape after adding data =  (6, 10, 73, 144)
>>>
>>>
>>> print "levels shape after adding pressure data = ",levels.shape
levels shape after adding pressure data =  (10,)

注意:當沿著 temp 變量的 level 維度增加數據時,level 變量的大小將會增加。

>>>
>>> levels[:] =  [1000.,850.,700.,500.,300.,250.,200.,150.,100.,50.]

然而,numpy 和 netcdf 變量在切片規則上稍有不同。通常是使用 start:stop:step 的形式進行切片。對 netcdf 變量而言,布爾數組和整型序列索引的行為與 numpy 數組是不同的。這些索引在每一個維度是單獨作用的(類似 fortran 中的向量下標法)。這意味著:

>>> temp[0, 0, [0,1,2,3], [0,1,2,3]]

切片 netcdf 變量時返回形狀為 (4, 4) 的數組, 但是對 numpy 數組而言,將返回形狀為 (4, )的數組。類似的,用[0, array([True, False, True]), array([False, True, True, True]), :]檢索一個形為 (2, 3, 4, 5)的netcdf數組,將返回一個 (2, 3, 5) 數組,但對於 numpy 來說,這將引起錯誤,因為這相當於  [0, [0,1], [1,2,3], :]。當使用整數序列切片時,索引不需要排序而且其可能包含重複值。對於 numpy 的 'fancy indexing' 可能引起一些迷惑。通過使對維度數組執行邏輯操作來創建切片,可以提取多維 netcdf 變量數據。

比如:

>>> tempdat = temp[::2, [1,3,6], lats>0, lons>0]

將提取時間維的 0, 2, 4層,壓力層的 1, 3, 6層,北半球和東半球交叉部分。返回數組的大小為 (3, 3, 36, 71)。

>>> print "shape of fancy temp slice = ",tempdat.shape
shape of fancy temp slice =  (3, 3, 36, 71)

注意:針對標量變量,為了提取標量變量的數據,可以使用 np.asarray(v) 或 v[...],結果是一個 numpy 標量數組。

處理時間坐標

大部分元數據標準(比如CF)指出:時間的測量應該是使用固定的日曆並且相對於一個固定的日期來測量,其單位應該類似於 YY:MM:DD hh-mm-ss

如果沒有專門的轉換工具的話,這種單位通常比較難處理。此模塊提供了 num2date,date2num函數來處理。

>>>
>>> from datetime import datetime, timedelta
>>> from netCDF4 import num2date, date2num
>>> dates = [datetime(2001,3,1)+n*timedelta(hours=12) for n in range(temp.shape[0])]
>>> times[:] = date2num(dates,units=times.units,calendar=times.calendar)
>>> print "time values (in units %s): " % times.units+"\n",times[:]
time values (in units hours since January 1, 0001):
[ 17533056.  17533068.  17533080.  17533092.  17533104.]
>>> dates = num2date(times[:],units=times.units,calendar=times.calendar)
>>> print "dates corresponding to time values:\n",dates
dates corresponding to time values:
[2001-03-01 00:00:00 2001-03-01 12:00:00 2001-03-02 00:00:00
2001-03-02 12:00:00 2001-03-03 00:00:00]

num2date 轉換指定了 unitscalendar 的數值為 datetime 對象,而date2num執行相反的操作。當前定義的calendars均是基於 CF元數據轉換標準。date2index函數返回和一系列 datetime 實例對應的netcdf時間變量的索引。

從多個netcdf數據集中獲取數據

如果你想從多個文件中獲取一個變量的數據,可以使用 MFDataset 類進行數據獲取。相比使用單個文件名創建一個 Dataset 實例,MFDataset 實例可以通過一系列文件名或含有通配符的字符串從多個文件中獲取數據。當然前提是這些文件必須具有相同的無限維數據,然後才能執行切片操作。

目前只有 NETCDF3_64BIT_OFFSET, NETCDF3_64BIT_DATA, NETCDF3_CLASSIC orNETCDF4_CLASSIC  格式文件支持上述操作,NETCDF4格式暫不支持多文件獲取。

>>> from netCDF4 import MFDataset
>>> f = MFDataset("mftest*nc")
>>> print f.variables["x"][:]

注意:只能用來讀取數據,不能用於寫入數據。

有效壓縮 netcdf 變量

存儲在 netcdf4 對象中的數據可以執行壓縮和解壓縮操作。通過createVariable 方法的 zlib,complevel,shuffle關鍵詞參數可以確定執行壓縮操作的參數。

要執行壓縮操作,zlib = True;complevel 表示壓縮速度和效率(1表示速度最快,但壓縮比最小,9表示速度最慢,但壓縮比最高);設置 shuffle = False,將關閉 HDF5 的 shuffle 過濾,在重新排序字節進行壓縮之前會對數據塊進行逐行掃描。shuffle 過濾器能顯著改善壓縮比,默認打開此選項。

設置 createVariable 方法的 fletcher32 關鍵詞參數為 True(默認為 False),將利用 Fletcher32 校驗算法進行錯誤檢查,而關鍵詞參數 chunksizes 和 endian 可以用來設置存儲在 HDF5 文件中的 HDF 塊(chunking)參數和二進位字節序(endian-ness)。這些關鍵詞參數僅和 NETCDF4NETCDF4_CLASSIC 文件相關,其他格式文件(NETCDF3_CLASSIC, NETCDF3_64BIT_OFFSET, NETCDF3_64BIT_DATA)會自動忽略這些關鍵詞參數。

如果你的數據有固定精度的話(比如,溫度數據,通常其精度為 0.1 度),可以通過 creatVariable 函數的 least_significant_digit  關鍵詞參數進行數據量化,從而有效改善zlib壓縮。

比如:如果數據的精度為 0.1,設置 least_significant_digit = 1將會使數據被量化為 numpy.around(scale*data)/scale, scale = 2**bits,此例中 bits = 4,這會導致壓縮有損而不是無損,當然這是為了磁碟空間而必須做出的犧牲。

此例中,可以分別執行以下語句看一下文件的大小變化:

>>> temp = rootgrp.createVariable("temp","f4",("time","level","lat","lon",))

>>> temp = dataset.createVariable("temp","f4",("time","level","lat","lon",),zlib=True)

>>> temp = dataset.createVariable("temp","f4",("time","level","lat","lon",),zlib=True,least_significant_digit=3)

如果想要了解更多關於之前提到的三種數據類型可查閱官方文檔。

相關焦點

  • 使用Python處理NetCDF格式文件
    複雜的數據處理工作和二維可視化可以使用matlab,python或NCL,三維可視化可以使用VisAD,Vis5d,IDV等。處理nc文件的工具很多,此次僅利用python來講一下如何處理nc文件。目前Python中最受歡迎的處理NetCDF數據的庫是netCDF4-python。此外,scipy.io模塊也提供了NetCDF文件接口,可以用來讀取NetCDF文件。
  • python中的模塊詳解
    概念python中的模塊是什麼?簡而言之,在python中,一個文件(以「.py」為後綴名的文件)就叫做一個模塊,每一個模塊在python裡都被看做是一個獨立的文件。模塊可以被項目中的其他模塊、一些腳本甚至是交互式的解析器所使用,它可以被其他程序引用,從而使用該模塊裡的函數等功能,使用Python中的標準庫也是採用這種方法。分類在Python中模塊分為以下幾種:系統內置模塊,例如:sys、time、json模塊等等;自定義模塊,自定義模塊是自己寫的模塊,對某段邏輯或某些函數進行封裝後供其他函數調用。
  • 【python】os 模塊使用筆記
    複製文件的函數居然在os模塊中不存在!原因是複製文件並非由作業系統提供的系統調用。理論上講,我們通過上一節的讀寫文件可以完成文件複製,只不過要多寫很多代碼。幸運的是shutil模塊提供了copyfile()的函數,你還可以在shutil模塊中找到很多實用函數,它們可以看做是os模塊的補充。
  • Python3 pickle模塊的使用詳解
    pickle模塊特點1、只能在python中使用,只支持python的基本數據類型。2、可以處理複雜的序列化語法。
  • Python程式設計師進階之路:從新手到高手的100個模塊
    ,真實反映了 python 程式設計師在成長過程中的一些困惑。英漢小詞典pythoneer - 指所有用python語言開發程序的人pythonista - 意為資深的、追求質量和品味的python開發者本文所列舉的這100個模塊,是在工作和學習中用過的或者正在學習的,算是學習總結。希望對處在迷茫中的程式設計師有所幫助。
  • 萬字長文詳解Python正則表達式及re模塊
    本文帶來的是偷學Python第三十一天:Python正則表達式語法及re模塊的使用,其他內容將在近期更新完畢exp) 零寬度負回顧後發斷言,來斷言此位置的前面不能匹配表達式exp,Python中提供的re模塊使Python擁有全部正則表達式的功能!
  • python之OS模塊39個常用函數詳解
    作者:小伍哥 來源:AI入門學習os,語義作業系統,所以該模塊就是作業系統相關的功能了,用於處理文件和目錄這些我們日常手動需要做的操作,比如新建文件夾、獲取文件列表、刪除某個文件、獲取文件大小、重命名文件、獲取文件修改時間等,該模塊就包含了大量的作業系統操作函數,精選常用的進行解析,希望對大家有所幫助。
  • 第39天: Python itertools 模塊
    而 itertools 作為 Python 的內置模塊,就為我們提供了一套非常有用的用於操作可迭代對象的函數。常用功能 count 功能詳解count(start=0,step=1) 函數有兩個參數,其中 step 是默認參數,可選的,默認值為 1。該函數返回一個新的迭代器,從 start 開始,返回以 step 為步長的均勻間隔的值。
  • python的模塊和序列
    前言概要本章節主要講述python中的模塊和序列的概念以及如何使用模塊和序列化方面的知識。模塊的概念在python中有個關鍵詞是import,代表的是導入、加載的意思。通常import加載的模塊分為四個通用類別:使用python語言編寫的代碼(後綴名為py的文件)已被編譯為共享庫或DLL的C或C++的擴展使用C編寫並連接到python解釋器的內置模塊
  • Python之os模塊
    Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
  • python中的Requests模塊
    講解對象:python中的Requests模塊作者:融水公子 rsgz介紹:1 Requests 是一個第三方 Python 模塊2 Requests 唯一的一個非轉基因的apt-get update  #更新軟體列表2 安裝pip3執行命令:sudo apt-get install python3
  • Python中正則表達式模塊詳解
    用來處理字符串,對字符串進行檢索和替換,另外正則在python爬蟲的應用也是相當廣泛!
  • Python學習筆記:模塊和包
    模塊就是python程序,任何python程序都可作為模塊導入。對於任何程序,只要導入了模塊,即可使用該模塊內的所有成員。,您好,歡迎學習Python4User[name=Charlie],您好,歡迎學習Python5白骨精正在慢慢地走路6User[name=白骨精]加載模塊在編譯一個python模塊之後,如果直接用import或from … import來導入該模塊,python通常並不能加載該模塊。
  • Python logging 模塊詳解
    如果程序包含多個模塊,則用以下實例來顯示日誌信息:實例中有兩個模塊,一個模塊通過導入另一個模塊的方式用日誌顯示另一個模塊的信息:myapp.py 模塊import loggingimport mylibdef main(): logging.basicConfig(filename='myapp.log
  • python中logging模塊詳解
    為什麼需要logging模塊用python寫代碼的時候,想看哪裡的輸出直接print就可以了。
  • 三分鐘從入門到精通——Python模塊
    中的模塊:假設您正在使用python解釋器。因此,python有一種方法可以將該函數定義放入文件中並隨時使用。模塊是ModuleType類型的對象。該模塊基本上是一個python文件(擴展名為的文件.py),其中包含定義和語句(例如:類,函數,變量等)。Python中的模塊為我們提供了邏輯上組織代碼的靈活性。我們使用模塊將大型程序分解為小的可管理文件。
  • python中常用模塊詳解
    Python中的內置模塊實現)。本次我們的主題是以Python中最常使用的json和pickle模塊為例,深入探討Python在處理此類問題時,模塊的應用範圍和優缺點,本次分為三個章節進行討論。今天,我們詳解pickle模塊的使用。什麼是序列化?
  • Python函數詳解一(函數參數、變量作用域)
    Python函數函數是python程序的重要組成部分。所謂函數就是實現某一特定功能的代碼段,可重複使用,提高了代碼的利用率。
  • python模塊三劍客之time os sys
    概要在python有幾個常用的模塊,今天來介紹一下python模塊中的三劍客:time模塊、os模塊、sys模塊。一、time模塊在python中,所有跟時間有關的操作都要用到時間模塊。我們在使用這個模塊之前,首先需要導入這個模塊。
  • Python之re模塊方法詳解(正則表達式)
    學習re模塊首先要對python正則表達式要了解,正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配