檔案和輸入輸出
- 檔案對象
- 泛義的檔案對象:具有檔案類型介面的對象,例如檔案,Web網頁,通訊。檔案就是連續的位元組序列。資料的傳輸經常用到位元組流。
- open(): file_object = open(file_name, access_mode = 'r', buffering = -1)。 file_name可以是相當路徑或是絕對路徑。file()和open()功能完全可以替換。
- 通用分行符號支援(UNS):當使用‘U’標誌開啟檔案時,所有的行分隔字元通過Python的輸入方法返回時都會被替換為分行符號NEWLINE(\n)。檔案對象具有newlines屬性。UNS只用於讀取文字檔,沒有對應的處理檔案輸出的方法.
- 有關二進位檔案和文字檔的討論在筆記的末尾
- 檔案內建方法
檔案方法分為四類:輸入,輸出,檔案內移動,雜項操作
- 輸入:
read()方法用來直接讀取size個位元組到字串中。不指定size,讀至檔案末尾。(@deprecated)
readline()方法讀取開啟檔案的一行,將包括行結束符的整行返回為一個字串。也有size參數
readlines()方法讀取所有(剩餘)行,返回字串列表。sizhint代表返回的最大位元組大小
- 輸出:
write()含有文本資料或位元據塊的字串寫入到檔案中
writelines()將一個字串列表寫入檔案,但是行結束符不會自動加入行尾。需要自己處理列表中的字串
read()和readlines()讀取行,不會自行刪去行分隔字元,write()和writelines()寫入時不會自行加入行分隔字元,都需要程式員自行操作。
- 檔案內移動:
seek()可以再檔案中移動檔案指標到不同的位置。offset位元組代表相對於某個位置的位移量。位置的預設值為0,代表從檔案開頭算起,1代表從當前位置,2代表從檔案末尾。(類似fseek())。
text()方法告訴當前檔案指標在檔案中的位置,從檔案起始算起,單位為位元組。
- 檔案方法雜項:
close()顯示關閉檔案來結束對它的訪問。儘早的釋放控制代碼是個好習慣,避免對資源的空閑佔用。不顯示關閉檔案,可能丟失輸出緩衝區的資料
fileno()返回開啟檔案的描述符。flush()方法會直接把內部緩衝區的資料立刻寫入檔案。truncate()方法將檔案截取到當前檔案指標位置或者到給定size,以位元組為單位。
行分隔字元和其他檔案系統差異:Posix系統上,行分隔字元是分行符號NEWLINE(‘\n’)字元,舊的MacOS下是RETURN(\r),DOS和Wind32系統結合使用兩者(\r\n)。路徑分隔字元Posix使用“/”,Dos和Windows使用“\”,舊的MacOS使用“:”。匯入os模組,跨平台時會有差異的變數自動會被設定為正確的值。
print語句預設在輸出內容末尾加一個分行符號,在語句後加一個逗號可以取消這個行為。truncate()方法接受可選size作為參數,如果給定,檔案將被截取到最多size位元組處。沒有,則截取到當前檔案指標位置。tell()會返回開始截取的位元組位置。
標準檔案:標準輸入(一般是鍵盤),標準輸出(到顯示器的緩衝輸出),標準錯誤(到螢幕的非緩衝輸出),命名同c,stdin,stdout,stderr。訪問控制代碼:匯入sys模組,使用sys.stdin,sys.stdout,sys.stderr.print語句通常是輸出到sys.stdout.內建的raw_input()通常從sys.stdin接受輸入。
sys.argv屬性提供對命令列參數的訪問。命令列參數是調用某個程式時除程式名以外的其它參數。sys.argv[0]永遠是程式的名稱
os模組式訪問操縱系統功能的主要介面。os模組還負責處理大部分的檔案系統操作,包括刪除/重新命名檔案,遍曆分類樹,以及管理檔案存取權限等。os.path 可以完成一些針對路徑名的操作. 它提供的函數可以完成管理和操作文 件路徑名中的各個部分, 擷取檔案或子目錄資訊, 檔案路徑查詢等操作.
- 永久儲存模組
資料的扁平化(或者資料的序列化,資料的順序化)將比基本類型複雜的對象轉換為一個位元據集合,這樣就可以把資料集合儲存起來或通過網路發送,然後再重新把資料集合恢複原來的對象格式。
- DBM風格的模組:
多種實現:dbhash/bsddb,dbm,gdbm,dumbdbm.建議使用anydbm模組,它會自動選擇最合適的。它們只能儲存字串,不能對Python對象進行序列化
- shelve模組:
shelve模組使用anydbm選擇最適合的DBM模組,然後使用cPickle來完成對儲存轉換過程。
- pickle和cPickle
使用pickle模組吧Python對象直接儲存到檔案裡。無需關心其他。pickle模組中兩個函數:dump()和load()。dump()接受一個檔案控制代碼和一個資料對象作為參數,把資料對象以特定格式儲存到給定檔案裡。load()函數從檔案取出儲存的對象。cPickle是pickle的一個更快的c語言編譯版本
錯誤和異常
- 檢測和處理異常
try-except:語句文法:
try: try_suite # watch for exceptions here except Exception[,reason]: except_suite # exception-handling code
一個try當然可以帶有多個except,用來分別處理多種類型的異常。一個except要處理多種異常,異常要被放在一個元組裡
當函數沒有顯式的返回一個值時,它就返回None
捕獲所有普通異常:except Exception:或者使用裸except子句 except:(不推薦@deprecated)
sys.exc_info()返回最近一個被except語句捕獲的異常的資訊。
兩種特殊異常:SystemExit 是由於當前 Python 應用程式需要退出, KeyboardInterupt 代表使用者按下了 CTRL-C (^C) , 想要關閉 Python .他們與Exception平級。要接受包括他們的所有異常,使用裸except或者except BaseException
二進位檔案和文字檔返回原處
作為檔案的資料,在電腦中都是以二進位的形式儲存的,對於文字檔和二進位檔案的區分,不是在物理上的,而是在邏輯上的。
文字檔是字元序列,是基於字元編碼的,儲存的是字元的編碼(如ASCII碼)序列;二進位檔案時位元組序列,是基於值編碼的,或者說沒有什麼特別的編碼,它同資料在記憶體中的形式相同,僅僅是位元組成的位元組序列。
區別
- “文字檔、二進位檔案”和“以文本方式開啟、以二進位方式開啟”是完全不同的概念。
- 是否以二進位方式開啟檔案,即調用fopen時是否帶b,對使用fwrite以二進位方式寫入的結果沒有影響,不論是在Linux下還是在Windows下;對使用fprintf以文本方式寫入的結果僅在Windows下有影響,影響結果就是不帶b時會有‘\n'到'\r\n'的轉換,帶b時沒有這個轉換,對在Linux下的寫入沒有影響。
- 文本工具開啟檔案過程:首先讀取檔案物理上所對應的的二進位位元流,然後按照協議規定的解碼方式來解釋這個流,然後將解釋結果顯示出來。比如按照ASCII碼形式,他會8個bit8個bit的解釋檔案流。
感覺就是在Linux下不要管它,在windows下,如果不是以b的mode開啟,分行符號當成'\n'處理就行了。什麼'\r\n'與‘\n’的轉換,後台都處理好了。以b的mode讀取,就要考慮'\r\n'的情況。。。這篇文章寫的很不錯。。