標籤:pen 類型 file 編碼 link windows 換行 檔案描述符 use
一.檔案處理流程
- 開啟檔案,得到檔案控制代碼並賦值給一個變數
- 通過控制代碼對檔案進行操作
- 關閉檔案
二.基本操作2.1 檔案操作基本流程初探
f = open(‘chenli.txt‘) #開啟檔案first_line = f.readline()print(‘first line:‘,first_line) #讀一行print(‘我是分隔線‘.center(50,‘-‘))data = f.read()# 讀取剩下的所有內容,檔案大時不要用print(data) #列印讀取內容 f.close() #關閉檔案
2.2 檔案編碼檔案儲存編碼如下
此刻錯誤的開啟檔案
f=open(‘chenli.txt‘,encoding=‘utf-8‘)f.read()
正確的開啟檔案
#不指定開啟編碼,預設使用作業系統的編碼,windows為gbk,linux為utf-8,與解譯器編碼無關
f=open(‘chenli.txt‘,encoding=‘gbk‘) #在windows中預設使用的也是gbk編碼,此時不指定編碼也行
f.read()
2.3 檔案開啟模式
1 檔案控制代碼 = open(‘檔案路徑‘, ‘模式‘)
開啟檔案時,需要指定檔案路徑和以何等方式開啟檔案,開啟後,即可擷取該檔案控制代碼,日後通過此檔案控制代碼對該檔案操作。
開啟檔案的模式有:
- r ,唯讀模式【預設模式,檔案必須存在,不存在則拋出異常】
- w,唯寫模式【不可讀;不存在則建立;存在則清空內容】
- x, 唯寫模式【不可讀;不存在則建立,存在則報錯】
- a, 追加模式【可讀; 不存在則建立;存在則只追加內容】
"+" 表示可以同時讀寫某個檔案
- r+, 讀寫【可讀,可寫】
- w+,寫讀【可讀,可寫】
- x+ ,寫讀【可讀,可寫】
- a+, 寫讀【可讀,可寫】
"b"表示以位元組的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
註:以b方式開啟時,讀取到的內容是位元組類型,寫入時也需要提供位元組類型,不能指定編碼
2.4 檔案內建函數flush
flush原理:
- 檔案操作是通過軟體將檔案從硬碟讀到記憶體
- 寫入檔案的操作也都是存入記憶體緩衝區buffer(記憶體速度快於硬碟,如果寫入檔案的資料都從記憶體刷到硬碟,記憶體與硬碟的速度延遲會被無限放大,效率變低,所以要刷到硬碟的資料我們統一往記憶體的一小塊空間即buffer中放,一段時間後作業系統會將buffer中資料一次性刷到硬碟)
- flush即,強制將寫入的資料刷到硬碟
捲軸:
import sys,timefor i in range(10): sys.stdout.write(‘#‘) sys.stdout.flush() time.sleep(0.2)
2.5 檔案內游標移動
注意:read(3)代表讀取3個字元,其餘的檔案內游標移動都是以位元組為單位如seek,tell,read,truncate
整理中
2.6 open函數詳解
1. open()文法
open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])
open函數有很多的參數,常用的是file,mode和encoding
file檔案位置,需要加引號
mode檔案開啟模式,見下面3
buffering的可取值有0,1,>1三個,0代表buffer關閉(只適用於二進位模式),1代表line buffer(只適用於文字模式),>1表示初始化的buffer大小;
encoding表示的是返回的資料採用何種編碼,一般採用utf8或者gbk;
errors的取值一般有strict,ignore,當取strict的時候,字元編碼出現問題的時候,會報錯,當取ignore的時候,編碼出現問題,程式會忽略而過,繼續執行下面的程式。
newline可以取的值有None, \n, \r, ”, ‘\r\n‘,用於區分分行符號,但是這個參數只對文字模式有效;
closefd的取值,是與傳入的檔案參數有關,預設情況下為True,傳入的file參數為檔案的檔案名稱,取值為False的時候,file只能是檔案描述符,什麼是檔案描述符,就是一個非負整數,在Unix核心的系統中,開啟一個檔案,便會返回一個檔案描述符。
2. Python中file()與open()區別
兩者都能夠開啟檔案,對檔案進行操作,也具有相似的用法和參數,但是,這兩種檔案開啟檔案有本質的區別,file為檔案類,用file()來開啟檔案,相當於這是在構造檔案類,而用open()開啟檔案,是用python的內建函數來操作,建議使用open
3. 參數mode的基本取值
| Character |
Meaning |
| ‘r‘ |
open for reading (default) |
| ‘w‘ |
open for writing, truncating the file first |
| ‘a‘ |
open for writing, appending to the end of the file if it exists |
| ‘b‘ |
binary mode |
| ‘t‘ |
text mode (default) |
| ‘+‘ |
open a disk file for updating (reading and writing) |
| ‘U‘ |
universal newline mode (for backwards compatibility; should not be used in new code) |
r、w、a為開啟檔案的基本模式,對應著唯讀、唯寫、追加模式;
b、t、+、U這四個字元,與以上的檔案開啟模式組合使用,二進位模式,文字模式,讀寫入模式、通用分行符號,根據實際情況組合使用、
常見的mode取值組合
1 r或rt 預設模式,文字模式讀 2 rb 二進位檔案 3 4 w或wt 文字模式寫,開啟前檔案儲存體被清空 5 wb 二進位寫,檔案儲存體同樣被清空 6 7 a 追加模式,只能寫在檔案末尾 8 a+ 可讀寫入模式,寫只能寫在檔案末尾 9 10 w+ 可讀寫,與a+的區別是要清空檔案內容11 r+ 可讀寫,與a+的區別是可以寫到檔案任何位置
2.7 上下文管理
with open(‘a.txt‘,‘w‘) as f: pass
with open(‘a.txt‘,‘r‘) as read_f,open(‘b.txt‘,‘w‘) as write_f: data=read_f.read() write_f.write(data)
2.8 檔案的修改
import oswith open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as read_f, open(‘.a.txt.swap‘,‘w‘,encoding=‘utf-8‘) as write_f: for line in read_f: if line.startswith(‘hello‘): line=‘哈哈哈\n‘ write_f.write(line)os.remove(‘a.txt‘)os.rename(‘.a.txt.swap‘,‘a.txt‘)
python檔案處理