Python模塊的學習:
1、os模塊:
下面只對os模塊中幾個比較常用的方法做一些簡單的示例:
os.system():這個方法在shell中體現的比較多,在dos命令行中也可以執行,下面就以在dos命令行中為例,說下system方法的作用(通過這個示例,大家對system方法的實用就一目了然了):
1 >>> import os 2 >>> print(os.system('ls')) 3 'ls' 不是內部或外部命令,也不是可運行的程序 4 或批處理文件。 5 1 6 >>> print(os.system('dir')) 7 驅動器 C 中的卷沒有標簽。 8 卷的序列號是 B8F2-0DE4 9 10 C:\Users 的目錄 11 12 2016/04/09 23:29 <DIR> . 13 2016/04/09 23:29 <DIR> .. 14 2016/04/09 23:27 <DIR> Administrator 15 2016/05/15 09:24 <DIR> Administrator.02CNFVTO5VIJUAD 16 2016/05/01 22:21 <DIR> Public 17 0 個文件 0 字節 18 5 個目錄 27,973,791,744 可用字節 19 0 20 >>>
os.path.abspath(name):獲得絕對路徑
print(os.path.abspath(__file__)):獲取當前的文件的絕對路徑
os.path.join(path,name):連接目錄與文件名或目錄
os.path.dirname(path):返回文件路徑
應用說明:當你在一個目錄的模塊中調用另一個目錄下的模塊的時候,就需要用到上面的幾個方法:
(os.path.dirname(os.path.dirname(os.path.abspath(__file__))):這個結合的使用的作用是返回當前文件的上上級目錄,然后再通過os.path.join方法去拼接其它的目錄和文件,就可以找到其它目錄的模塊或者文件了。最后結合sys模塊把要找的路徑加到sys.path變量中去,就可以了。)
用os.path編寫平台無關的程序
os.path.abspath("1.txt") == os.path.join(os.getcwd(), "1.txt")
os.path.split(os.getcwd()) 用於分開一個目錄名稱中的目錄部分和文件名稱部分。
os.path.join(os.getcwd(), os.pardir, 'a', 'a.doc') 全成路徑名稱.
os.pardir 表示當前平台下上一級目錄的字符 ..
os.path.getctime("/root/1.txt") 返回1.txt的ctime(創建時間)時間戳
os.path.exists(os.getcwd()) 判斷文件是否存在
os.path.expanduser('~/dir') 把~擴展成用戶根目錄
os.path.expandvars('$PATH') 擴展環境變量PATH
os.path.isfile(os.getcwd()) 判斷是否是文件名,1是0否
os.path.isdir('c:\Python26\temp') 判斷是否是目錄,1是0否
os.path.islink('/home/huaying/111.sql') 是否是符號連接 windows下不可用
os.path.ismout(os.getcwd()) 是否是文件系統安裝點 windows下不可 用
os.path.samefile(os.getcwd(), '/home/huaying') 看看兩個文件名是不是指的是同一個文件
os.path.walk('/home/huaying', test_fun, "a.c")
備注:在這里只對其它的一些方法做一些簡單的介紹。
2、sys模塊:
這個模塊中的方法跟os中的方法相結合,可以實現一些路徑的查找,(這個在上面也有提到)比如:
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))));找到所在文件的上上級目錄,以后去其它目錄下導入模塊的時候,就可以直接使用'from 路徑 import 模塊' 這種形式來實現了。
當Python執行import sys語句的時候,它在sys.path變量中所列目錄中尋找sys.py模塊。如果找到了這個文件,這個模塊的主塊中的語句將被運行,然后這個模塊將能 夠被你 使用 。注意,初始化過程僅在我們 第一次 輸入模塊的時候進行。另外,“sys”是“system”的縮寫。
sys模塊中的argv變量通過使用點號指明——sys.argv——這種方法的一個優勢是這個名稱不會與任何在你的程序中使用的argv變量沖突。另外,它也清晰地表明了這個名稱是sys模塊的一部分。
sys.argv變量是一個字符串的 列表 (列表會在后面的章節詳細解釋)。特別地,sys.argv包含了 命令行參數 的列表,即使用命令行傳遞給你的程序的參數。
如果你使用IDE編寫運行這些程序,請在菜單里尋找一個指定程序的命令行參數的方法。
這里,當我們執行python using_sys.py we are arguments的時候,我們使用python命令運行using_sys.py模塊,后面跟着的內容被作為參數傳遞給程序。Python為我們把它存儲在sys.argv變量中。
記住,腳本的名稱總是sys.argv列表的第一個參數。所以,在這里,'using_sys.py'是sys.argv[0]、'we'是 sys.argv[1]、'are'是sys.argv[2]以及'arguments'是sys.argv[3]。注意,Python從0開始計數,而非從1開始。
sys.path 包含輸入模塊的目錄名列表。我們可以觀察到sys.path的第一個字符串是空的——這個空的字符串表示當前目錄也是sys.path的一部分,這與 PYTHONPATH環境變量是相同的。這意味着你可以直接輸入位於當前目錄的模塊。否則,你得把你的模塊放在sys.path所列的目錄之一。
arg3
3、下面再簡單的介紹幾個模塊:
json(pickle):序列化和反序列化的實現,看下面的實例。
1 import json 2 f = open('test','r') 3 line = f.readlines() 4 user_dict = line[0] 5 print(type(user_dict)) 6 user_dict = json.load(user_dict) 7 print(type(user_dict)) 8 9 #輸出結果 10 <class 'str'> 11 File "D:/PycharmProjects/s13/test/test.py", line 54, in <module> 12 user_dict = json.load(user_dict) 13 File "D:\python35\lib\json\__init__.py", line 265, in load 14 return loads(fp.read(), 15 AttributeError: 'str' object has no attribute 'read'
我們一步一步的進行分析,首先輸出的第一行證明了,代碼的前五行還沒有出現問題;那么由代碼的報錯信息可知,是第六行出現了問題,但是user_dict確實字符串,而json.load確實是反序列化輸出(就是把字符串轉換成字典類型),糾結的好長時間才發現原來是test文件的問題,有的人就會問了,它會有什么問題,有問題的話,也不會出街結果了啊。這句話問的好,我們可以先看下test文件的內容:
{'name':'alex','age':26} ,其實就是這么一個簡單的字典。那么我們先把單引號換成雙引號試試 ==》{"name":"alex","age":26}
結果發現還是不行,這時候突然想起來還有一個loads,,,奧,這時候才發現自己犯了一個多么低級的錯誤,load是讀取文件的內容並反序列化輸出,而loads是把字符串反序列化輸出,我們上面寫的代碼是把文件中的內容輸出成一個字符串了,所以用load肯定是不行了,應該用json.loads(user_dict)才可以;如果用load 去加載的話,會更方便:
user_dict_json = json.load(open('test','r')) print(type(user_dict_json)) print(user_dict_json) #輸出結果 <class 'dict'> {'name': 'alex', 'age': 26}
現在大家應該是一目了然了吧,我相信你現在也是恍然大明白的!!!
下面再來說下json的dump和dumps方法:
大家現在都知道了,json.load和json.loads是反序列化輸出一個結果,dump和dumps跟json.load和json.loads正好相反,是序列化輸出到終端或者文件中去。看下面這個實例:
1 import os 2 import json 3 4 str = 'This is a dump test' 5 dict = {'name':'alex','age':22} 6 print(json.dumps(str)) 7 print(json.dumps(dict)) 8 print(json.dump(dict)) 9 10 #輸出結果 11 "This is a dump test" 12 {"age": 22, "name": "alex"} 13 Traceback (most recent call last): 14 File "D:/PycharmProjects/test/test.py", line 8, in <module> 15 print(json.dump(dict)) 16 TypeError: dump() missing 1 required positional argument: 'fp'
從這段代碼中,我們可以總結出以下幾點:
1、dumps是輸出到終端的操作方法,也就是把一個類型的變量轉換成str類型的操作;dump是對文件操作的方法,具體的操作是這樣的,json.dump(dict,open('test','w'))
2、不管你輸入的變量中帶有的是單引號,還是雙引號,dump和dumps都會給你轉換成雙引號,因為只有這樣,在你做load或者loads的時候,它才能反序列化輸出。
pickle的load、loads和dump、dumps的使用操作:
先來說下,pickle和json的差異:
1、pickle和json都可以實現序列化和反序列化的操作。
2、在寫入文件的時候,pickle是以加密的方式寫入的。
3、pickle可以對類創建的對象進行反序列化輸入到文件中。
下面對pickle的load和dump做個簡單的實例:

1 import pickle 2 3 class teacher: 4 def __init__(self,favor,name,age): 5 self.favor = favor 6 self.name = name 7 self.age = age 8 self.asset = 0 9 10 def reduce(self): 11 self.asset = self.asset - 100 12 def gain(self,value): 13 self.asset += value 14 15 tech1 = teacher('打球','toney',28) 16 tech2 = teacher('雞湯','alex',30) 17 tech3 = teacher('睡覺','tim',25) 18 tech_list = [tech1,tech2,tech3] 19 tech_file = open('teacher','wb') 20 pickle.dump(tech_list,tech_file) 21 tech_file.close() 22 23 class course: 24 li = pickle.load(open('teacher','rb')) 25 print(li[0]) 26 print(li[0].name) 27 28 #輸出結果 29 <__main__.teacher object at 0x0000000000802B70> 30 toney
這里面涉及到了一些面向對象的知識,如果不懂面向對象的話,大家可以略過,只看pickle的dump和load方法就行,有兩點需要注意的是,pickle存到文件中的數據是加密過的。在打開文件的時候,‘wb’是以二進制的形式寫入。
4、接下來聊聊時間模塊,這幾個模塊還是比較有意思的,以后在寫腳本的時候也會用到的比較多:
time: 這個模塊所表示的時間格式不太明顯,不太容易被公眾所調用。
datetime:這個模塊輸出的時間格式更直觀,也是用的最多的:
datetime模塊定義了下面這幾個類:
-
-
- datetime.date:表示日期的類。常用的屬性有year, month, day;(比如,當你執行datetime.date.today()的時候,就會顯示今天的年月日)
- datetime.time:表示時間的類。常用的屬性有hour, minute, second, microsecond;
- datetime.datetime:表示日期時間。(比如:datetime.datetime.today(),就會列出當前時刻的時間)
- datetime.timedelta:表示時間間隔,即兩個時間點之間的長度。
-