一.檔案讀寫和打開
• Python 内置了讀寫檔案的函數,用法和 C 是相容的。
• 作業系統不允許普通的程式直接操作磁盤,是以,讀寫檔案就是請求作業系統打開一個檔案對象(又稱檔案描述符),
然後,通過作業系統提供的接口從這個檔案對象操作
• 為引入主題可以先思考以下把大象放進冰箱的過程?
打開冰箱-->把大象放進去--->關上冰箱
然後思考檔案讀寫的過程:
打開檔案-->向檔案中寫入内容--->關閉檔案
open函數的模式
r 以讀的方式打開,定位到檔案開頭 , 預設的 mode
r+ 以讀寫的方式打開,定位檔案開頭 , 可以寫入内容到檔案
w 以寫的方式打開,打開檔案的時候會清空檔案的内容,并且不能讀
w+ 以讀寫的方式打開,定位到檔案頭,并且打開檔案的時候也會清空檔案的内容
a 以寫的方式打開,定位到檔案的末尾,是一個追加的操作 , 但并不允許讀
a+ 以讀寫的方式打開,定位到檔案的末尾,追加的方式。
在使用以上 mode 打開檔案的時候,如果增加了b 模式,表示以二進制方式打開
*如果讀取的檔案是一個非文本檔案,在原有模式上加b eg:'rb' 'rb+' 'ab' 'ab+'
1.f = open('/root/hello')
#括号引号後如果不加任何東西,預設為以讀的方式打開檔案
#如果檔案不存在, open() 函數就會抛出一個 IOError 的錯誤,并且給出錯誤碼和詳細的資訊告訴你檔案不存在;
python學習筆記之檔案操作
2.f.read()
#如果檔案打開成功,接下來,調用 read() 方法可以一次讀取檔案的全部内容;
python學習筆記之檔案操作
思考:read()會一次性讀取檔案的全部内容,如果檔案有 10G,記憶體就爆了,怎麼解決?
• 如果檔案很小, read() 一次性讀取最友善;
• 如果不能确定檔案大小,反複調用 read(size)
• 比較保險;如果是配置檔案,調用 readlines()
#readlines()方法以清單方式傳回檔案資訊,預設保留換行符;
python學習筆記之檔案操作
#read()輸出的是元組形式
python學習筆記之檔案操作
#readline()方法是依次讀取檔案,僅傳回一行檔案
3.f.writelines()可以寫入多行文本内容
二.檔案的其他操作
1.f.flush()函數,将緩沖區的内容寫入到硬碟中
2.f.seek(offset[,whence]),offset 表示移動多少位元組,
whence 為 1 的時候表示相對于目前位置移動的;當 2 的時候從檔案的末尾往後移動,但不一定所有的平台都支援;
預設為 0 表示從檔案開頭往後移動
簡而言之:seek(1,2)需要傳兩個值
第一個參數:偏移量;>0,代表向右移動的字元;反之,向左移動的字元;
第二個參數:0-->檔案開頭 1--->代表目前位置 2-->檔案末尾
3.f.tell()函數,傳回目前檔案指針的偏移量:
4.fileno() 函數,傳回目前的檔案描述符,一個數字
5.isatty() 函數,目前打開的檔案是否是一個終端裝置
6.closed 屬性,目前檔案是否關閉 ,|True,False, f.closed
7.file 對象是一個疊代器:可進行for循環 for i in
8.next() 方法 , 一行一行的讀 , 每次讀取一行
9.檔案的内置屬性:
#檢視檔案的打開模式 print f.mode
#檢視檔案名 print f.name
示例如下:
python學習筆記之檔案操作
三.with文法
一般情況打開一個檔案,經過操作之後,都要顯式的執行xx.close() 将檔案關閉 .with 用于需要打開、關閉成對的操作,可以自動關閉打開對象 .
with expression as obj:# 将打開的對象指派給 obj
expression
#obj 的作用域隻在 with 語句中
with open('/etc/passwd') as f1:
print f1.read()
print f1.closed
應用練習:
-顯示檔案的所有行,但忽略以#開頭的行;
-拓展:處理#不在檔案開頭的注釋;
-思路:打開檔案-->s.strip()[0]=='#'
-關閉檔案
python學習筆記之檔案操作
把/etc/passwd檔案中的‘root’字元替換為'westos',将更換後的另存為/tmp/passwd檔案
python學習筆記之檔案操作