Python 基礎教程(第二版)(第十~十一章)
第十章
- 包(package):當模塊存儲在文件中時(擴展名 .py),包就是模塊所在的目錄,但必須包含一個名爲 _init_.py 的文件。
- 探究模塊:
- dir : 要查看模塊所包含的內容,dir函數會將對象多有特性列出。
- _all_:包含一個列表,定義了模塊的共有接口(public interface)。在模塊中設置__all__,使用其他模塊導入該模塊的時候(from * 這種形式導入),只能導入 __all__中設定的變量、函數和類。
- help():查看函數或模塊用途的詳細說明。
- _file_屬性:可以查看模塊的絕對路徑。
- 標準庫:
- sys module
- sys.argv:包括傳遞到Python解釋器的參數,包括腳本名稱。
- sys.exit(int):大多數使用默認值0用來標識程序成功運行,也可以提供字符串信息用作錯誤信息。
- sys.modules:映射模塊名到載入模塊的字典。
- sys.path:字符串列表,是模塊所在目錄的目錄名列表。
- sys.platform:字符串,是解釋器正在其上運行的“平臺”名稱。如操作系統(win32)或如Java虛擬機的其他種類平臺。
- sys.stdin, sys.stdout, sys.stderr:是類文件流對象,他們表示UNIX概念中的標準輸入、標準輸出和標準錯誤。
- os module:
- os.environ:對環境變量進行映射
>>>os.environ['PYTHONPATH']
- os.system(command):在子shell中執行操作系統命令,用來運行外部程序。
- os.sep:用於路徑中的分隔符。UNIX中的標準分隔符是“/”,Windows中的是“\”。
- os.pathsep:pathsep用於分割路徑名。UNIX使用“:”,Windows 使用“;”。
- os.linesep:用於文本文件的字符串分隔符。UNIX中爲一個換行符 (\n), Mac OS 中爲單個回車符 (\r), Windows 中則是兩者的組合 (\r\n)。
- os.urandom(n):使用一個依賴於系統的“真”隨機數源,如果平臺不支持,就會得到 NotImplementError。
- os.environ:對環境變量進行映射
- fileinput module:
- fileinput.(input([files[, inplace[, backup]]])) :用於遍歷多個輸入流的行。參數(inplace=True)進行原地處理。在原地處理時backup參數將文件名擴展備份到原始文件創建的備份文件中。
- fileinput.filename():返回當前正在處理的文件名。
- fileinput.lineno():返回當前累計的行數。所以在完成一個文件處理並開始處理下一個文件時,行數不會重置而是將上一個文件的最後行數加一作爲計數的開始。
- filename.filelineno():返回當前處理的文件的當前行數。每次在完成一個文件處理並開始處理下一個文件時,行數都會重置爲1。
- filename.isfirstline():在當前行數當前文件的第一行時返回真值,反之,返回假值。
- filename.isstdin():在當前文件爲sys.stdin時返回真值,否則返回假值。
- filename.nextfile():關閉當前文件,跳到下一個文件,跳過的行不計。
- filename.close():關閉當前文件鏈,結束迭代。
- Set 集合:主要用於檢查成員資格,因此副本是被忽略的。
- & | ^:可對兩個集合進行按位與、按位或和按位異或計算,分別得到兩個集合的交集、並集和對稱差集。
- union(set):求兩集合的並集。
a.union(b)
- issubset(set):判斷是不是一個集合的子集。
a.issubset(b)
- isuperset(set):判斷是不是一個集合的父序列。
a.issuperset(b)
- intersection(set):求兩集合的交集。
a.intersection(b)
- difference(b):求集合a對集合b的差集。與直接進行減運算效果相同
a.difference(b)
a-b - symmetric_difference(set):求兩集合的對稱差集。
- copy():複製一集合。
- heap 堆
- heappush(heap, x):將x入堆
- heappop(heap):將堆中最小的元素彈出
- heaify(heap):將heap屬性強制應用到任意一個列表。使用任意列表作爲參數,並且通過儘可能少的移位操作,將其轉換成合法的堆。
- heapreplace(heap, x):將堆中最小的元素彈出,同時將x入堆
- nlargest(n, iter):返回iter中第n大的元素
- nsmallest(n, iter):返回iter中第n小的元素
- deque 雙端隊列
- 支持append, appendleft, pop, popleft, rotate, extend, extendleft等操作。
- time module
- 日期元組:Python 日期元組的字段含義0-8分別對應年、月、日、時、分、秒、周、儒歷日和夏令時。
- time.asctime([tuple]):將當前時間轉化爲字符串。
- time.localtime([secs]):將實數(從新紀元開始的秒數)轉化爲本地時間的元組。如果想要獲得全球統一時間可以使用gmtime。
- time.mktime(tuple):將日期元祖轉換成從新紀元開始計算的秒數。
- time.sleep(secs):休眠secs秒
- time.strptime(string[, format]):將字符串轉換爲日期元祖。
- time.time():使用自新紀元開始計算的秒數返回當前時間。
- random module
- random.random():返回 0<=n<1 的實數。
- random.getrandbits(n):以長整型返回n個隨機位(二進制數)
- random.uniform(a, b):返回 a<=n
- sys module
第十一章
打開文件:open(name[, mode[, buffering]])。open 函數使用一個文件名作爲唯一的強制參數,然後返回一個對象文件。模式(mode)和緩衝(buffering)參數都是可選的。
- r:讀模式
- w:寫模式
- a:追加模式
- b:二進制模式(可添加到其他模式中使用)
- +:讀/寫模式(可添加到其他模式中使用)
在模式參數中使用U參數能夠再打開文件時使用通用的換行符支持模式,在這種模式下,所有的換行符/字符串都被替換爲\n,而不用考慮也運行的平臺。
緩衝(buffering):
- 0(或者 False):I/O(輸入/輸出)就是無緩衝的,所有讀寫都是直接針對硬盤。
- 1(或者 True):I/O 就是有緩衝的,使用內存來代替硬盤。
- 大於1的數字:表示緩衝區的大小(字節)
- -1(或者任何負數):表示默認的緩衝區大小
基本文件方法–讀和寫。首先解釋一個術語:類文件——類文件對象是支持一些文件的方法和對象。如果有一個名爲f的類文件對象,就可以使用f.write()和f.read(string)寫入和讀取對象。
>>>f.open('somefile.txt', 'w') #默認爲 r 模式
>>>f.write('Hello, ')
>>>f.write('World!')
>>>f.close()
>>>f.open('somefile.txt', 'r')
>>>f.read(4)
'Hell'
>>>f.read() #通過不提供要讀取字符數的方式會讀取剩下所有的文件。
o, World!
管式輸出:在UNIX的shell中,使用管道(pipeline)可以在一個命令後面學些其他的多個命令,如
$ cat somefile.txt | python somescript.py | sort
- cat somefile.txt:只是把somefile.txt的內容寫到標準輸出(sys.stdout)
- python somescript.py:這個命令運行了Python腳本somescript。結果應該是從標準輸入讀,把結果寫到標準輸出。
- sort:這條命令從標準輸入(sys.stdin)讀取所有文本,按字母順序,然後把結果寫到標準輸入。
管道符號(|)將一個命令的標準輸入和下一個標準輸入連在一起。這樣somescript.py會從sys.stdin中讀取數據(cat somefile.txt寫入的),並把結果寫入它的sys.stdout(sort在此讀入數據)。
隨機訪問:可以使用seek和tell來直接訪問感興趣的部分。
- seek(offset[, whence]):把當前位置(進行讀和寫的位置)移動到由offset定義的位置。whence.offset是一個字節(字符)數,默認爲0,即偏移量(非負)是從文件頭開始計算的。
>>>f.open(r'c:\text\somefile.txt', 'w')
>>>f.write('0123456789')
>>>f.seek(5)
>>>f.write('Hello, World!')
>>>f.close(r'c:\text\somefile.txt')
>>>f.rean()
01234Hello, World!56789
- tell():返回當前文件的位置
>>>f = open(r'c:\text\somefile.txt')
>>>f.read(3)
012
f.read(2)
34
f.tell()
5 #在這種情況下返回的是一個長整數,但不是所有情況都是這樣的
- seek(offset[, whence]):把當前位置(進行讀和寫的位置)移動到由offset定義的位置。whence.offset是一個字節(字符)數,默認爲0,即偏移量(非負)是從文件頭開始計算的。
- 讀寫行
- file.readline():讀取單獨的一行(從當前位置開始知道一個換行符的出現,也讀取這個換行符),不適用任何參數(這樣讀取並返回一行)或使用一個非負整數作爲readline可以讀取字符的最大值。
- file.readlines():讀取一個文件中的所有行並將其作爲列表返回。
- writelines:傳給它一個字符串列表(任何序列或者可迭代對象),它會把所有字符串寫入文件(或流)。不會增加新行,需要自己添加。
- 關閉文件:通常來說,一個文件對象在退出程序後(也可能在退出前)自動關閉。with語句可以打開文件並將其賦值到變量上。文件再語句結束後會自動關閉,即便是由於異常引起的。
with open('somefile.txt') as somefile
do_something(somefile)
在寫入了一些文件內容之後,通常是希望這些改變立刻體現在文件證,這樣其他讀取了這個文件的程序也能知道改變。如果數據被緩存了(在內存中臨時地存儲),知道關閉文件纔會被寫入到文件。如果需要繼續使用文件(不關閉文件),又想將磁盤上的文件進行更新,就要調用問價對象的flush方法。不管在什麼時候,能關閉文件的時候最好關閉文件。 - 上下文管理器(context manager):支持上下文管理協議的對象,這種對象實現了enter()和exit()方法。
- enter():不帶任何參數,它在進入with語句塊的時候,被調用,返回綁定值到as關鍵後的變量上。返回文件對象本身。
- exit():帶有三個參數:異常類型、異常對象和異常回溯。在離開方法時這個函數被調用。如果返回False,那麼所有異常都不會被處理。會關閉文件。
- 對文件內容進行迭代:
- 按字節處理:
f = open(filename)
char = f.read(1)
while char:
process(char)
char = f.read(1) #當到達文件末尾時,read()返回一個空的字符串
f.close()
- 按行操作:
f = open(filename)
while True:
line = f.readline()
if not line: break
process(line)
f.close()
- 讀取所有內容:可以使用不帶參數的read()一次讀取整個文件,也可以使用readlines()把文件讀入一個字符串列表,這樣列表中每個字符串就是一行。
- 使用fileinput實現懶惰行迭代:當文件非常大時,使用readlines會佔用太多內存。可以使用for可以使用一個名爲懶惰行迭代的方法,因爲他只是讀取實際需要的部分。
import fileinput
for line in fileinput(filename):
process(line)
- 文件迭代器:從 Python 2.2開始,文件對象就是可迭代的,即可在for循環中使用它們。
f = open(filename)
for line in f:
process(line)
f.close()
對文件進行迭代而不使用變量存儲文件對象,不需要顯式地關閉文件
for line in open(filename):
process(line)
標準輸入是可迭代的for line in sys.stdin
- 按字節處理: