一、文件打開方式
打開方式 |
指針位置 |
讀取的文件類型 |
|
r |
只讀(默認模式) |
指針在文件開頭,文件不存在則報錯 |
1. 默認讀取文件都是ASCII編碼的文本文件 2. 如果讀取的文件是二進制文件,如圖片,視頻需要使用'rb'模式 3. 讀取非ASCII編碼的文本文件,必須 以二進制模式打開,再解碼 f=open('E:/test.txt','rb') f.read().decode('gbk')
|
rb |
二進制格式只讀 |
指針在文件開頭,文件不存在則報錯 |
|
r+ |
可讀可寫 |
指針在文件開頭,文件不存在則報錯 |
|
rb+ |
二進制格式可讀可寫 |
指針在文件開頭,文件不存在則報錯 |
|
w |
只寫 |
文件存在,則覆蓋;不存在,則創建 |
|
wb |
二進制格式只寫 |
文件存在,則覆蓋;不存在,則創建 |
|
w+ |
可讀可寫 |
文件存在,則覆蓋;不存在,則創建 |
|
wb+ |
二進制格式可讀可寫 |
文件存在,則覆蓋;不存在,則創建 |
|
a |
追加 |
文件存在,指針在文件尾增加;不存在,則創建 |
|
ab |
二進制格式追加 |
文件存在,指針在文件尾增加;不存在,則創建 |
|
a+ |
可讀可寫 |
文件存在,指針在文件尾增加;不存在,則創建 |
|
ab+_ |
二進制格式可讀可寫 |
文件存在,指針在文件尾增加;不存在,則創建 |
二、文件打開方法
|
舉例 |
文件不存在 |
是否需要調用close()方法 |
注意 |
Python內置open函數 |
f=open('E:/test.txt','r') |
文件不存在則會IOError |
必須書寫調用close() |
1.文件對象會占用操作系統的資源,並且操作系統同一時間能打開的文件數量也有限 2.當寫文件時,操作系統不會立刻將數據寫入磁盤,而是放內容緩存,空閑時再寫入,只有調用close()方法時,操作數據才會將沒有寫入的數據寫入磁盤。不寫close()方法有可能只寫了一部分數據到磁盤,剩下的數據丟失了 3.文件不存在,可以用try…finally避免,但與with比較麻煩
|
With語句 |
with open('E:/test.txt','r') as f: |
文件不存在則會IOError |
with語句自動調用close()方法 |
三、文件讀寫定位操作
|
方法 |
用法 |
注意 |
讀 |
f.read(size) |
如果沒有size即f.read()一次性讀取文件全部內容,返回類型str;如果有size即f.read(50)讀取最多的字節內容 |
1.文件很小,可一次性讀取,文件較大,超過內存大小,內容爆掉 2.文件過大,可用f.read(size),x為每次最多讀取size字節的內容 3.如果是配置文件,調用 readlines()最方便 |
f.readline() |
每次讀取一行內容,返回類型str |
||
f.readlines() |
一次讀取所有內容並按行返回list |
||
寫 |
f.write() |
寫文件 |
將字符串寫入文件,如果寫入結束,需要在字符串后面加上"\n" |
定位 |
f.seek(offset,from_what) |
f.seek(2,0)讀取位置向后移動2個字符 |
from_what值為文件的開始位置,可以省略;offset為偏移量 |
當前位置 |
f.tell() |
f.tell(),返回當前文件位置 |
四、讀取非ASCII文件,如utf-8,gbk類型
方法1:讀取時指定類型encoding='utf-8'
with open('E:/test1.txt','r',encoding='utf-8') as f
print(f.read())
結果:
你好
方法2:
必須:1.以二進制模式打開,再解碼
codecs模塊:讀文件時自動轉換編碼,直接讀出unicode
import codecs
with codecs.open('E:/test.txt','rb','utf-8') as f:
f.read()
注意:有些編碼不規范,會遇到UnicodeDecodeError,可能文件中有些非法編碼的字符,遇到這種情況,可用open()函數可以接收errors參數,表示如果遇到編碼錯誤后如何 處理,最簡單方式是直接忽略f=open('E:/test1.txt','r',encoding='gbk',errors='ignore')
五、File對象的屬性
f.closed |
文件已關閉返回true,否則返回false |
f.mode |
返回被打開文件的訪問模式 |
f.name |
返回文件名稱 |
本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。