Python模塊的介紹


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所列的目錄之一。

    

import sys

 

 

 

print sys.argv[0]

 

print sys.argv[1]

 

print sys.argv[2]

 

print sys.argv[3]

 

那么

 

[root@databak scripts]# python test.py arg1 arg2 arg3

 

test.py

 

arg1

 

arg2

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
View Code

    這里面涉及到了一些面向對象的知識,如果不懂面向對象的話,大家可以略過,只看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:表示時間間隔,即兩個時間點之間的長度。

 

    

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM