一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的後綴。node
若是退出python解釋器而後從新進入,那麼以前定義的函數或者變量都將丟失,所以一般將程序寫到文件中以便永久保存下來,須要時就經過python test.py方式去執行,或者把他們當作模塊來導入到其餘的模塊中,實現了功能的重複利用,python
當解釋器遇到import語句,若是模塊在當前的搜索路徑就會被導入,若是不在當前路徑就會按照系統環境變量導入正則表達式
語法 import name1,name2 別名 impor name1 as name2
模塊能夠包含可執行的語句和函數的定義,這些語句的目的是初始化模塊,它們只在模塊名第一次遇到導入import語句時才執行(import語句是能夠在程序中的任意位置使用的,且針對同一個模塊很import屢次,爲了防止你重複導入,python的優化手段是:第一次導入後就將模塊名加載到內存了,後續的import語句僅是對已經加載大內存中的模塊對象增長了一次引用,不會從新執行模塊內的語句)算法
Python的from語句讓你從模塊中導入一個指定的部分到當前命名空間中。shell
語法 from modname import name1[, name2[, ... nameN]] 把一個模塊的全部內容全都導入到當前的命名空間也是可行的 from modname import * 別名 from modname import name1 as name2
print(time.time())#做爲時間戳使用,是計算機 Unix 誕生的時間(1970) print(time.altzone)#返回與utc時間的時間差,以秒計算\ print(time.asctime())#返回時間格式"Sat Feb 18 15:15:03 2017" print(time.ctime()) #返回Fri Aug 19 12:38:29 2016 格式, 同上 print(time.localtime()) #返回本地時間 的struct time對象格式 print(time.gmtime())#返回utc的時間 print(time.strftime('%Y-%m-%d %H:%M:%S'))#自定義格式,2017-02-18 15:26:29 print(time.strptime('2017-02-18 15:26:29','%Y-%m-%d %H:%M:%S'))#將固定格式轉換爲時間對象 print(time.localtime(time.time()))#時間戳到時間對象的轉換 print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))#時間戳到自定義時間格式轉換 print(time.strptime('2017-02-18 15:43:11','%Y-%m-%d %H:%M:%S'))#自定義時間到時間對象的裝換 print(time.mktime(time.strptime('2017-02-18 15:43:11','%Y-%m-%d %H:%M:%S')))#自定義時間到時間戳的轉換
print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925 print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925 print(datetime.date.fromtimestamp(time.time()) ) # 時間戳直接轉成日期格式 2016-08-19 print(datetime.datetime.now() + datetime.timedelta(3)) #當前時間+3天 print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #當前時間+30分 #時間替換 c_time = datetime.datetime.now() print(c_time.replace(minute=3,hour=2))
print(random.choice([1,'23',[4,5],'bac']))
os.getcwd() 獲取當前工做目錄,即當前python腳本工做的目錄路徑
os.chdir("dirname") 改變當前腳本工做目錄;至關於shell下cd
os.curdir 返回當前目錄: ('.')
os.pardir 獲取當前目錄的父目錄字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄
os.removedirs('dirname1') 若目錄爲空,則刪除,並遞歸到上一級目錄,如若也爲空,則刪除,依此類推
os.mkdir('dirname') 生成單級目錄;至關於shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄,若目錄不爲空則沒法刪除,報錯;至關於shell中rmdir dirname
os.listdir('dirname') 列出指定目錄下的全部文件和子目錄,包括隱藏文件,並以列表方式打印
os.remove() 刪除一個文件
os.rename("oldname","newname") 重命名文件/目錄
os.stat('path/filename') 獲取文件/目錄信息
os.sep 輸出操做系統特定的路徑分隔符,win下爲"\",Linux下爲"/"
os.linesep 輸出當前平臺使用的行終止符,win下爲"\t\n",Linux下爲"\n"
os.pathsep 輸出用於分割文件路徑的字符串 win下爲;,Linux下爲:
os.name 輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix'
os.system("bash command") 運行shell命令,直接顯示,返回命令結果的執行狀態
os.environ 獲取系統環境變量
os.path.abspath(path) 返回path規範化的絕對路徑
os.path.split(path) 將path分割成目錄和文件名二元組返回
os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) 返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
os.path.exists(path) 若是path存在,返回True;若是path不存在,返回False
os.path.isabs(path) 若是path是絕對路徑,返回True
os.path.isfile(path) 若是path是一個存在的文件,返回True。不然返回False
os.path.isdir(path) 若是path是一個存在的目錄,則返回True。不然返回False
os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑以前的參數將被忽略
os.path.getatime(path) 返回path所指向的文件或者目錄的最後存取時間
os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間
os.path.normpath(path) 規範化路徑,轉換path的大小寫和斜槓編程
用於序列化的兩個模塊:
json,用於字符串 和 python數據類型間進行轉換
pickle,用於python特有的類型 和 python的數據類型間進行轉換json
Json模塊提供了四個功能:序列化(dumps、dump)、反序列化(loads、load)
pickle模塊提供了四個功能:序列化(dumps、dump)、反序列化(loads、load)bash
序列化:內存存儲方式轉換爲字符串
反序列化:字符串轉換爲內存存儲方式
json 與 pickle功能徹底相同,只是 json 只支持少許字符串格式,如:str、int、float、set、dict、list、tupleapp
import pickle date = { 'id': 6452523, 'credit':15000, 'balance':8000, 'passwd':'asasda' } with open('account','wb') as df: df.write(pickle.dumps(date)) with open('account','rb') as df: print(pickle.loads(df.read()))
shutil.copyfileobj(fsrc, fdst[, length])將文件內容拷貝到另外一個文件中,能夠限制長度分次導入dom
shelve模塊是一個簡單的k,v將內存數據經過文件持久化的模塊,能夠持久化任何pickle可支持的python數據格式
f = shelve.open('logging') f['name']=['a','b','c'] tmpe = f['name']#只能經過這樣的方式添加 tmpe.append('d') f['name'] = tmpe print(f) f.close()
xml是實現不一樣語言或程序之間進行數據交換的協議,跟json差很少,但json使用起來更簡單
import xml.etree.ElementTree as ET tree = ET.parse("xmltest.xml")#parse 是解析的意思 root = tree.getroot()#根節點 print(root.tag) #遍歷xml文檔,直接用循環嵌套就行tag是標記,text是數據,attrib是屬性 for child in root: print(child.tag, child.attrib) for i in child: print(i.tag,i.text) #只遍歷year 節點,直接搜關鍵字便可 for node in root.iter('year'): print(node.tag,node.text) #修改 for node in root.iter('year'): new_year = int(node.text) + 1 node.text = str(new_year) node.set("updated","yes") tree.write("xmltest.xml") #刪除node for country in root.findall('country'): rank = int(country.find('rank').text) if rank > 50: root.remove(country) tree.write('output.xml') #新建xml new_xml = ET.Element("namelist")#根節點 name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"}) age = ET.SubElement(name,"age",attrib={"checked":"no"}) sex = ET.SubElement(name,"sex") sex.text = '33' name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"}) age = ET.SubElement(name2,"age") age.text = '19' et = ET.ElementTree(new_xml) #生成文檔對象 et.write("test.xml", encoding="utf-8",xml_declaration=True)#第一行聲明 ET.dump(new_xml) #打印生成的格式
在 python 2.x 版本中 configparser 須要大寫
#建立ConfigParser實例 config=ConfigParser.ConfigParser() #讀取模塊信息,不會顯示默認模塊 config.sections() #讀取模塊下的參數,若是有 default 默認模塊也會顯示 config.options('section') #返回section 模塊下,option 參數的值 config.get(section,option) #返回section 模塊下,option 參數的鍵和值 config.itens('section') #添加一個配置文件節點(str) config.add_section(str) #設置section節點中,鍵名爲option的值(val) config.set(section,option,val) #讀取文件 config.read(filename) #寫入配置文件 config.write(obj_file) #刪除某個模塊或該模塊的某個鍵 config.remove_option('section','option')
生成文件
import configparser config = configparser.ConfigParser() config["DEFAULT"] = {'ServerAliveInterval': '45', 'Compression': 'yes', 'CompressionLevel': '9'} config['bitbucket.org'] = {} config['bitbucket.org']['User'] = 'hg' config['topsecret.server.com'] = {} topsecret = config['topsecret.server.com'] topsecret['Host Port'] = '50022' # mutates the parser topsecret['ForwardX11'] = 'no' # same here config['DEFAULT']['ForwardX11'] = 'yes' with open('example.ini', 'w') as configfile: config.write(configfile) #生成以下格式 [DEFAULT] ServerAliveInterval = 45 Compression = yes CompressionLevel = 9 ForwardX11 = yes [bitbucket.org] User = hg [topsecret.server.com] Port = 50022 ForwardX11 = no
修改已有的文件
>>> import configparser >>> config = configparser.ConfigParser() >>> config.sections()#查看配置文件中有哪些模塊,由於沒指定文件,因此是空的 [] >>> config.read('example.ini') ['example.ini'] >>> config.sections()#此時有了,默認的模塊沒有顯示 ['bitbucket.org', 'topsecret.server.com'] >>> 'bitbucket.org' in config#判斷是相應模塊是否存在 True >>> 'bytebong.com' in config False >>> config['bitbucket.org']['User']#查看參數 'hg' >>> config['DEFAULT']['Compression'] 'yes' >>> topsecret = config['topsecret.server.com'] >>> topsecret['ForwardX11'] 'no' >>> topsecret['Port'] '50022' >>> for key in config['bitbucket.org']: print(key) ... user compressionlevel serveraliveinterval compression forwardx11 >>> config['bitbucket.org']['ForwardX11'] 'yes'
用於加密相關的操做,3.x裏代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
import hashlib m = hashlib.md5() m.update(b'hello') print(m.hexdigest()) m.update(b'my name is') print(m.hexdigest()) m2 = hashlib.md5() m2.update(b'hellomy name is') print(m2.hexdigest())#16進制 print(m2.digest())#二進制 #輸出結果 5d41402abc4b2a76b9719d911017c592 144e390a38d33b5257b20558ac017ad1 144e390a38d33b5257b20558ac017ad1 b'\x14N9\n8\xd3;RW\xb2\x05X\xac\x01z\xd1' #由於 m 的兩次結果是疊加的,就至關於 m2 # ######## sha1 ######## hash = hashlib.sha1() hash.update('admin') print(hash.hexdigest()) # ######## sha256 ######## hash = hashlib.sha256() hash.update('admin') print(hash.hexdigest()) # ######## sha384 ######## hash = hashlib.sha384() hash.update('admin') print(hash.hexdigest()) # ######## sha512 ######## hash = hashlib.sha512() hash.update('admin') print(hash.hexdigest())
每次調用該模塊就至關於啓動新的進程
>>> retcode = subprocess.call("ls -l",shell=Ture) #執行命令,打印命令結果 #執行命令,返回命令執行狀態 , 0 or 非0 >>> retcode = subprocess.call(["ls", "-l"]) #執行命令,若是命令結果爲0,就正常返回,不然拋異常 >>> subprocess.check_call(["ls", "-l"]) 0 #接收字符串格式命令,返回元組形式,第1個元素是執行狀態,第2個是命令結果 >>> subprocess.getstatusoutput('ls /bin/ls') (0, '/bin/ls') #接收字符串格式命令,並返回結果 >>> subprocess.getoutput('ls /bin/ls') '/bin/ls' #執行命令,並返回結果,注意是返回結果,不是打印,下例結果返回給res >>> res=subprocess.check_output(['ls','-l']) >>> res b'total 0\ndrwxr-xr-x 12 alex staff 408 Nov 2 11:05 OldBoyCRM\n' #上面那些方法,底層都是封裝的subprocess.Popen poll()當子進程執行完後等到結果狀態 wait()等待子進程結果狀態 terminate() 殺掉所啓動進程 communicate() 等待任務結束 stdin 標準輸入 stdout 標準輸出 stderr 標準錯誤 pid The process ID of the child process. #例子 >>> p = subprocess.Popen("df -h|grep disk",stdin=subprocess.PIPE,stdout=subprocess.PIPE,shell=True) >>> p.stdout.read() b'/dev/disk1 465Gi 64Gi 400Gi 14% 16901472 104938142 14% /\n'
正則表達式模塊
'.' 默認匹配除\n以外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行 '^' 匹配字符開頭,若指定flags MULTILINE,這種也能夠匹配上(r"^a","\nabc\neee",flags=re.MULTILINE) '$' 匹配字符結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也能夠 '*' 匹配*號前的字符0次或屢次,re.findall("ab*","cabb3abcbbac") 結果爲['abb', 'ab', 'a'] '+' 匹配前一個字符1次或屢次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb'] '?' 匹配前一個字符1次或0次 '{m}' 匹配前一個字符m次 '{n,m}' 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb'] '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC' '(...)' 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c '\A' 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的 '\Z' 匹配字符結尾,同$ '\d' 匹配數字0-9 '\D' 匹配非數字 '\w' 匹配[A-Za-z0-9] '\W' 匹配非[A-Za-z0-9] 's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t'
re.match 從頭開始匹配 re.search 匹配包含 re.findall 把全部匹配到的字符放到以列表中的元素返回 re.splitall 以匹配到的字符當作列表分隔符 re.sub 匹配字符並替換
反斜槓的困擾
與大多數編程語言相同,正則表達式裏使用""做爲轉義字符,這就可能形成反斜槓困擾。假如你須要匹配文本中的字符"",那麼使用編程語言表示的正則表達式裏將須要4個反斜槓"\\":前兩個和後兩個分別用於在編程語言裏轉義成反斜槓,轉換成兩個反斜槓後再在正則表達式裏轉義成一個反斜槓。
Python裏的原生字符串很好地解決了這個問題,這個例子中的正則表達式可使用r"\"表示。一樣,匹配一個數字的"\d"能夠寫成r"\d"。有了原生字符串,你不再用擔憂是否是漏寫了反斜槓,寫出來的表達式也更直觀
包是一個分層次的文件目錄結構,它定義了一個由模塊及子包,和子包下的子包等組成的Python的應用環境。