天天看點

python常用子產品用法_python常用子產品(一)

#什麼是子產品呢?就是用一大坨代碼來完成一個功能的代碼集合,是不是簡單易懂

#類似于函數式程式設計和面向過程程式設計,函數式程式設計則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對于一個複雜的功能來,可能需要多個函數才能完成(函數又可以在不同的.py檔案中),n個 .py 檔案組成的代碼集合就稱為子產品。

如:os 是系統相關的子產品;file是檔案操作相關的子產品

子產品分為三種:

自定義子產品

内置标準子產品(又稱标準庫)

開源子產品

#既然别人可以寫一個代碼集合組成子產品,我們自然也可以,這就是自定義子產品

自定義子產品 和開源子產品的使用參考 http://www.cnblogs.com/wupeiqi/articles/4963027.html

1.json子產品

用法:

python常用子產品用法_python常用子產品(一)
python常用子產品用法_python常用子產品(一)

1 importjson2 a ={3 '1':'a',4 '2':'b',5 '3':'c'

6 }7 with open("1.txt",'r+') as f:8 json.dump(a,f)9 print(json.load(f))10 >>>{'1': 'a', '2': 'b', '3': 'c'}11 f.write(json.dumps(a))12 print(json.loads(f.readline()))13 >>>{'1': 'a', '2': 'b', '3': 'c'}14

15 #dump:将資料通過特殊的形式轉換為所有程式語言都認識的字元串

16 ,并放入檔案,第一個參數是字典對象,第二個是檔案對象17 #dumps:将資料通過特殊的形式轉換為所有程式語言都認識的字元串

18 #loads:将json編碼的字元串再轉換為python的資料結構

19 #load:從資料檔案中讀取資料,并将json編碼的字元串轉換為python的資料結構

20

21 #說明:

22 json編碼支援的基本類型有:None, bool, int, float, string, list, tuple, dict.23

24 對于字典,json會假設key是字元串(字典中的任何非字元串key都會在編碼時轉換為字元串),要符合JSON規範,應該隻對python清單和字典進行編碼。此外,在WEB應用中,把最頂層對象定義為字典是一種标準做法。25

26 json編碼的格式幾乎和python文法一緻,略有不同的是:True會被映射為true,False會被映射為false,None會被映射為null,元組()會被映射為清單[],因為其他語言沒有元組的概念,隻有數組,也就是清單。27 a ={28 '1':True,29 '2':False,30 '3':None,31 '4':(1,2,3),32 5:'qwe'

33 }34 da =json.dumps(a)35 print(da)36 >>>{"1": true, "2": false, "3": null, "4": [1, 2, 3], "5": "qwe"}

View Code

2. pickle子產品

用法:

python常用子產品用法_python常用子產品(一)
python常用子產品用法_python常用子產品(一)

1 importpickle2

3 defhello():4 for i in range(10):5 print('Hello',i)6 returnhello7 L ={8 'a':1,9 'b':2,10 'c':'Daniel'

11 }12 with open('pickle.txt','wb') as f:13 f.write(pickle.dumps(hello))14 with open('pickle.txt','wb') as f:15 f.write(pickle.dumps(L)) #pickle可以序列化python所有的資料類型,但僅允許在python中使用(等于是python獨有文法),與json不同,不管能否反序列化,都可以序列化

16 #如果你重新開個程式

17 importpickle18 with open('pickle.txt','rb') as f:19 a =pickle.loads(f.read())20 print(a)21 #則會報錯'AttributeError: Can't get attribute 'hello' on

22 #那如果調用‘L’則毫無問題,因為存的不是記憶體位址,而是資料

23 #是以說記憶體位址用完則釋放,兩個程式無法互相通路記憶體位址,資料可以直接反序列化

24

25 #當然pickle也有'load'、'dump'

26 L ={27 'a':1,28 'b':2,29 'c':'Daniel'

30 }31 with open('pickle.txt','wb') as f:32 pickle.dump(L,f)33 with open('pickle.txt','rb') as f:34 a =pickle.load(f)35 print(a)36 >>>{'a': 1, 'b': 2, 'c': 'Daniel'}

View Code

3.time & datetime子產品

用法:

python常用子產品用法_python常用子產品(一)
python常用子產品用法_python常用子產品(一)

1 importtime2

3 print(time.clock()) #傳回處理器時間,3.3開始已廢棄 , 改成了time.process_time()測量處理器運算時間,不包括sleep時間,不穩定,mac上測不出來

4 print(time.altzone) #傳回與utc時間的時間差,以秒計算\

5 print(time.asctime()) #傳回時間格式"Mon Nov 6 17:21:39 2017"

6 print(time.localtime()) #傳回本地時間 的struct time對象格式

7 print(time.gmtime(time.time()-800000)) #傳回utc時間的struc時間對象格式

8 print(time.asctime(time.localtime())) #傳回時間格式"Mon Nov 6 17:31:19 2017"

9 print(time.ctime()) 同上10

11 #日期字元串 轉成 時間戳

12

13 string_struct = time.strptime('2017/11/13',"%Y/%m/%d") #将 日期字元串 轉成 struct時間對象格式

14 print(string_struct)15 str_stamp = time.mktime(string_struct) #将struct時間對象轉成時間戳

16 print(str_stamp)17

18 #時間戳轉成日期字元串

19

20 print(time.gmtime(time.time()-86640))21 print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()))22

23 #時間加減

24

25 print(datetime.datetime.now())26 >>>2017-11-13 17:33:00.117320

27 print(datetime.date.fromtimestamp(time.time()))28 >>>2017-11-13 #時間戳直接轉成日期字元串

29 print(datetime.datetime.now() + datetime.timedelta(3)) #加三天

30 >>>2017-11-16 17:33:00.117320

31 print(datetime.datetime.now() + datetime.timedelta(-3)) #減三天

32 >>>2017-11-10 17:33:00.117320

33 print(datetime.datetime.now() + datetime.timedelta(hours=1))34 >>>2017-11-13 18:33:00.117320 #加一小時

35 print(datetime.datetime.now() + datetime.timedelta(hours=-1))36 >>>2017-11-13 16:33:00.117320 #減一小時

37 print(datetime.datetime.now()+datetime.timedelta(minutes=10)) #加十分鐘

38 >>>2017-11-13 17:43:00.117320

39 #so 那麼就有秒----"second"不舉例子了。=

40 print(now_time.replace(minute=0,hour=18,second=0,microsecond=0))41 >>>2017-11-13 18:00:00 #時間替換

View Code

4.random子產品

用法:

python常用子產品用法_python常用子產品(一)
python常用子產品用法_python常用子產品(一)

1 importrandom2

3 #生成随機數

4 print(random.random())5 print(random.randint(1,10000)) #給随機數指定範圍,最高為10000

6 print(random.randrange(1,10000000000)) #給随機數指定範圍,最高9999999999

7

8 #生成随機驗證碼

9

10 importrandom11 ver_code = ''

12 for i in range(5):13 number = random.randrange(0,5)14 if number !=i:15 letter = chr(random.randrange(65,99))16 else:17 letter = random.randint(0,9)18 ver_code +=str(letter)19 print(ver_code)

View Code

5.os子產品

提供對作業系統進行調用的接口

用法:

python常用子產品用法_python常用子產品(一)
python常用子產品用法_python常用子產品(一)

1 importos2

3 print(os.getcwd())4 >>>c:\test.py #檢視目前路徑(類似shell的pwd)

5 os.chdir('test')6 print(os.getcwd())7 >>>c:\test\test2 #改變目前路徑(類似shell的cd)

8 os.curdir #傳回目前目錄 (類似shell的cd .)

9 os.pardir #傳回父級目錄(類似shell的 cd ..)

10 os.makedirs('P1/P2/P3') #建立多級目錄

11 os.removedirs('A/B/C') #删除多級目錄,比如(A/B/C) 如果C是空的則删除,不是則不删除,并傳回錯誤,依次往上一級推

12 os.mkdir('test') #建立目錄('mkdir')

13 os.rmdir('test') #删除目錄,不為空則删除失敗

14 os.listdir('test') #列出目錄下的所有檔案和所有目錄

15 os.remove('test') #删除一個檔案

16 os.rename('oldtest','newtest') #修改檔案或目錄名字

17 print(os.stat('oldtest') #擷取檔案或目錄資訊

18 print(os.sep ) #傳回系統路徑分隔符

19 print(os.linesep) #傳回行的終止符

20 print(os.pathsep ) #傳回分割檔案路徑的字元串

21 os.environ #擷取系統環境變量

22 os.system("ping 1.1.1.1") #直接執行shell的指令

23 print(os.path.abspath('C:')) #傳回規範化的絕對路徑

24 print(os.path.split('c:/test'))25 >>>('c:', 'test') #将目錄和檔案以二進制組的方式傳回

26 print(os.path.dirname(path)) #傳回父級目錄,即'os.path.split'的第一個元素

27 print(os.path.basename('path')) #傳回結束的檔案名,即'os.path.split'的第二個元素

28 os.path.exists(path) #如果path存在,傳回True;如果path不存在,傳回False

29 os.path.isabs(path) #如果path是絕對路徑,傳回True

30 os.path.isfile(path) #如果path是一個存在的檔案,傳回True。否則傳回False

31 os.path.isdir(path) #如果path是一個存在的目錄,則傳回True。否則傳回False

32 os.path.join(path1[, path2[, ...]]) #将多個路徑組合後傳回,第一個絕對路徑之前的參數将被忽略

33 os.path.getatime(path) #傳回path所指向的檔案或者目錄的最後存取時間

34 os.path.getmtime(path) #傳回path所指向的檔案或者目錄的最後修改時間

View Code

6.sys子產品

用法:

python常用子產品用法_python常用子產品(一)
python常用子產品用法_python常用子產品(一)

1 sys.argv #配合腳本使用可以讀取從外面傳進來的參數

2 print(sys.version) #檢視python版本

3 sys.exit() #退出程式

4 sys.path #傳回子產品搜尋路徑,還有python環境變量

5 #還有modules,stdin,stdout,大家自己去查吧

View Code

7.shutil子產品

用法:

python常用子產品用法_python常用子產品(一)
python常用子產品用法_python常用子產品(一)

1 importshutil2

3 f1 = open('1.txt')4 f2 = open('2.txt','w',encoding='utf-8')5 shutil.copyfileobj(f1,f2) #複制檔案

6 shutil.copyfile('1.txt','2.txt') #可直接複制

7 shutil.copytree('1','2') #複制目錄,整個目錄

8 shutil.rmtree('2') #删除目錄

9 shutil.move(src,stc) #移動

10 shutil.make_archive('C:/1','zip','D:/test') #壓縮,打包

11

12 #還有兩種壓縮方式:'Zipfile','Tarfile'

13

14 Zipfile:15 壓縮:16 z = zipfile.ZipFile('test.zip','w') #一個一個選擇壓縮

17 z.write('test1.py')18 z.write('test2.py')19 z.close()20 解壓:21 z = zipfile.ZipFile('test.zip','r')22 z.extractall()23 z.close()24

25 Tarfile:26 #跟上面差不多,舉個例子

27 tar = tarfile.open('1.tar','w)

28 tar.add('test1.py')29 tar.close()30 #解壓跟上面完全一樣

31 tar.extractall()32 tar.close()

View Code

8.shelve子產品

shelve是一個簡單的的key,vlaue将記憶體資料通過檔案持久化的子產品,可以持久化任何pickle可支援的python資料格式

用法:

python常用子產品用法_python常用子產品(一)
python常用子產品用法_python常用子產品(一)

1 importshelve2

3 d = shelve.open('shelve_test') #打開一個檔案

4

5 classTest(object):6 def __init__(self, n):7 self.n =n8

9 t = Test(123)10 t2 = Test(123334)11

12 name = ["alex", "rain", "test"]13 d["test"] = name #持久化清單

14 d["t1"] = t #持久化類

15 d["t2"] =t216

17 d.close()18 d = shelve.open('shelve_test') #讀取

19 print(d.get('test'))20 >>>['alex', 'rain', 'test']

View Code

9.xml子產品

xml是實作不同語言或程式之間進行資料交換的協定,跟json差不多,但json使用起來更簡單,不過,古時候,在json還沒誕生的黑暗年代,大家隻能選擇用xml呀,至今很多傳統公司如金融行業的很多系統的接口還主要是xml。

xml的格式如下,就是通過<>節點來差別資料結構的:

python常用子產品用法_python常用子產品(一)
python常用子產品用法_python常用子產品(一)

1 <?xml version="1.0"?>

2

3

4 2

5 2008

6 141100

7

8

9

10

11 5

12 2011

13 59900

14

15

16

17 69

18 2011

19 13600

20

21

22

23

XML檔案

python常用子產品用法_python常用子產品(一)
python常用子產品用法_python常用子產品(一)

1 importxml.etree.ElementTree as ET2 tree = ET.parse("XML")3 root =tree.getroot()4

5 #讀取全部

6 print(root.tag)7 for child inroot:8 print(child.tag, child.attrib)9 for i inchild:10 print(i.tag,i.text)11

12 #隻讀取其中一項比如(year)

13 for node in root.iter('year'):14 print(node.tag,node.text)15

16

17 #修改xml檔案的内容

18 for node in root.iter('year'):19 new_year = int(node.text) + 1

20 node.text =str(new_year)21 node.set("updated", "yes")22

23 tree.write("XML") #将year+1

24

25 #删除xml檔案的内容

26 for country in root.findall('country'):27 rank = int(country.find('rank').text)28 if rank > 50:29 root.remove(country)30

31 tree.write('output.xml') #如果country下的rank大于50就删除country

32

33 #有删有改有查自然也有增

34 new_xml = ET.Element('company')35 post = ET.SubElement(new_xml,'post',attrib={"enrolled":"yes"})36 name = ET.SubElement(post,'name',attrib={"ehecked":"no"})37 age = ET.SubElement(name,'age')38 post.text = 'General manager'

39 name.text = 'Daniel'

40 age.text = '18'

41 et =ET.ElementTree(new_xml)42 et.write('XML',encoding='utf-8',xml_declaration=True)43 ET.dump(new_xml)

處理XML檔案

10.PyYaml

Python也可以很容易的處理ymal文檔格式,隻不過需要安裝一個子產品,參考文檔:http://pyyaml.org/wiki/PyYAMLDocumentation