
image.png
python基礎(chǔ)
文件的基本操作
文件操作步驟
以word文檔為例,打開(kāi)一個(gè)文件需要經(jīng)過(guò)以下幾個(gè)步驟:
- 打開(kāi)
- 讀或?qū)懟蚱渌僮?/li>
- 關(guān)閉
也可以只打開(kāi)和關(guān)閉文件,不進(jìn)行任何操作
文件操作的作用
文件操作就是把一些內(nèi)容或者數(shù)據(jù)存儲(chǔ)在一個(gè)地方,可以讓我們更方便的讀取和應(yīng)用以及共享
打開(kāi)文件的模式
打開(kāi)文件使用open函數(shù),返回值為文件對(duì)象
參數(shù):
- file_name:文件名,如果文件不在當(dāng)前目錄中需要指定路徑
- mode='r':【可選】打開(kāi)模式,如果不寫(xiě)默認(rèn)為r只讀打開(kāi)
- buffering=None:【可選】整數(shù),用于設(shè)置緩沖策略。0表示關(guān)閉緩沖(只允許在二進(jìn)制模式,否則報(bào)錯(cuò)ValueError: can't have unbuffered text I/O),1表示選擇行緩沖(僅在文本模式下可用),并以整數(shù)> 1表示 固定大小的塊緩沖區(qū)的大小。沒(méi)有緩沖參數(shù)時(shí) 默認(rèn)的緩沖策略如下:
- 二進(jìn)制文件:以固定大小的塊進(jìn)行緩沖;緩沖區(qū)的大小通常為4096或8192字節(jié)長(zhǎng)。
- 文本文件:使用行緩沖
- encoding=None: Encoding是用于解碼或編碼。只在文本文件被使用,默認(rèn)為utf-8
- errors=None: 如何處理編碼錯(cuò)誤,只適用于文本模式
| 處理標(biāo)準(zhǔn) | 錯(cuò)誤含義 |
|---|---|
| strict | 如果存在編碼錯(cuò)誤拋異常,和默認(rèn)None效果一樣 |
| ignore | 忽略錯(cuò)誤,但是需要注意如果忽略錯(cuò)誤會(huì)導(dǎo)致數(shù)據(jù)丟失 |
| replace | 將錯(cuò)誤部分替換為? |
| backslashreplace | 用 Python 的反斜杠轉(zhuǎn)義序列替換格式錯(cuò)誤的數(shù)據(jù)。 |
使用utf-8編碼寫(xiě)的中文使用gbk進(jìn)行讀取
UnicodeDecodeError: 'gbk' codec can't decode byte 0x97 in position 0: incomplete multibyte sequence # strict
hello鍚 # ignore
hello鍚? # replace
hello鍚\x97 # backslashreplace
- newline=None:控制通用換行符的工作方式,只適用于文本模式,可取的值有None、''、'\n'、'\r'和 '\r\n'【'\n'、'\r'和 '\r\n'都會(huì)進(jìn)行換行】
- 如果是讀,如果newline為none,通用換行模式開(kāi)啟,所有換行符都被轉(zhuǎn)換為'\n',如果newline為'',通用換行模式開(kāi)啟,但是返回之前并不對(duì)換行符進(jìn)行轉(zhuǎn)換。如果newline為其他有效值,只有該值為換行符,也就是只按該值換行,不對(duì)換行符進(jìn)行轉(zhuǎn)換
- 如果是寫(xiě)w或a,如果newline為none,任意'\n'都會(huì)被轉(zhuǎn)換為系統(tǒng)的默認(rèn)分隔符,可以通過(guò)執(zhí)行os.linesep來(lái)查看自己系統(tǒng)的換行符是什么,mac為'\n',如果newline為''或'\n',不進(jìn)行任何轉(zhuǎn)換,如果是其他有效值,將'\n'轉(zhuǎn)換成給定值
f = open('test.txt', 'w', 10, None, None, None)
f.write('nihaoya\nhaojiubujianle\r\nnizuijinhaoma\r')
f.close()
f = open('test.txt', 'r', 1, None, None, '')
print(f.readlines())
f.close()
# 先看寫(xiě),將讀的newline置為''不進(jìn)行任何轉(zhuǎn)換
'''
更改寫(xiě)的newline
None:['nihaoya\n', 'haojiubujianle\r\n', 'nizuijinhaoma\r'] # 將\n轉(zhuǎn)換為系統(tǒng)換行符,mac執(zhí)行os.linesep依舊是\n,所以相當(dāng)于沒(méi)有轉(zhuǎn)換
'':['nihaoya\n', 'haojiubujianle\r\n', 'nizuijinhaoma\r'] # 沒(méi)有進(jìn)行轉(zhuǎn)換
'\n':['nihaoya\n', 'haojiubujianle\r\n', 'nizuijinhaoma\r'] # 沒(méi)有進(jìn)行轉(zhuǎn)換
'\r':['nihaoya\r', 'haojiubujianle\r', '\r', 'nizuijinhaoma\r'] # 將\n轉(zhuǎn)換成了\r
'\r\n':['nihaoya\r\n', 'haojiubujianle\r', '\r\n', 'nizuijinhaoma\r'] # 將\n轉(zhuǎn)換成了\r\n
'''
# 下面將寫(xiě)部分的newline置為'',看讀
'''
更改讀的newline
None:['nihaoya\n', 'haojiubujianle\n', 'nizuijinhaoma\n'] # 所有換行符都被換成了\n
'':['nihaoya\n', 'haojiubujianle\r\n', 'nizuijinhaoma\r'] # 原樣,沒(méi)有進(jìn)行任何轉(zhuǎn)換
'\r':['nihaoya\nhaojiubujianle\r', '\nnizuijinhaoma\r'] # 只按\r進(jìn)行換行
'\n':['nihaoya\n', 'haojiubujianle\r\n', 'nizuijinhaoma\r'] # 只按\n進(jìn)行換行
'\r\n':['nihaoya\nhaojiubujianle\r\n', 'nizuijinhaoma\r'] # 只按\r\n進(jìn)行換行
'''
- closefd=True:如果closefd是False并且給出了文件描述符而不是文件名,則在文件關(guān)閉時(shí)底層文件描述符將保持打開(kāi)狀態(tài)。如果給定文件名closefd必須是True(默認(rèn)值),否則將引發(fā)錯(cuò)誤。
打開(kāi)模式mode類(lèi)別
| 類(lèi)別 | 描述 |
|---|---|
| r | 只讀,文件指針在文件的開(kāi)頭,如果文件不存在會(huì)拋異常 |
| rb | 以二進(jìn)制格式打開(kāi)文件,只讀,文件指針在文件的開(kāi)頭,如果文件不存在會(huì)拋異常 |
| r+ | 讀寫(xiě),文件指針在文件的開(kāi)頭,如果文件不存在會(huì)拋異常 |
| rb+ | 以二進(jìn)制格式打開(kāi)文件,讀寫(xiě),文件指針在文件的開(kāi)頭,如果文件不存在會(huì)拋異常 |
| w | 只寫(xiě)【覆蓋】,文件指針在文件的開(kāi)頭,如果文件存在,則打開(kāi)后覆蓋原有內(nèi)容,若文件不存在會(huì)新建文件 |
| wb | 以二進(jìn)制格式打開(kāi)文件,只寫(xiě)【覆蓋】,文件指針在文件的開(kāi)頭,如果文件存在,則打開(kāi)后覆蓋原有內(nèi)容,若文件不存在會(huì)新建文件 |
| w+ | 讀寫(xiě)【覆蓋】,文件指針在文件的開(kāi)頭,如果文件存在,則打開(kāi)后覆蓋原有內(nèi)容,若文件不存在會(huì)新建文件 |
| wb+ | 以二進(jìn)制格式打開(kāi)文件,讀寫(xiě)【覆蓋】,文件指針在文件的開(kāi)頭,如果文件存在,則打開(kāi)后覆蓋原有內(nèi)容,若文件不存在會(huì)新建文件 |
| a | 只寫(xiě)【追加】,文件指針在文件的結(jié)尾,如果文件存在,則打開(kāi)后覆蓋原有內(nèi)容,若文件不存在會(huì)新建文件 |
| ab | 以二進(jìn)制格式打開(kāi)文件,只寫(xiě)【追加】,文件指針在文件的結(jié)尾,如果文件存在,則打開(kāi)后覆蓋原有內(nèi)容,若文件不存在會(huì)新建文件 |
| a+ | 讀寫(xiě)【追加】,文件指針在文件的結(jié)尾,如果文件存在,則打開(kāi)后覆蓋原有內(nèi)容,若文件不存在會(huì)新建文件 |
| ab+ | 以二進(jìn)制格式打開(kāi)文件,讀寫(xiě)【追加】,文件指針在文件的結(jié)尾,如果文件存在,則打開(kāi)后覆蓋原有內(nèi)容,若文件不存在會(huì)新建文件 |
文件對(duì)象方法
讀
- read
語(yǔ)法:read(n:int)
參數(shù)解釋?zhuān)簄:字節(jié),指定n后每次讀取n個(gè)字節(jié)。若不指定默認(rèn)讀取文件所有內(nèi)容
用途:按字節(jié)讀取文件
print(f.read())
'''
nihaoya
haojiubujianle
nizuijinhaoma
'''
print(f.read(2)) # ha
- write
語(yǔ)法:write(s:Anystr)
參數(shù)解釋?zhuān)簊:需要向文件中寫(xiě)入的字符串,內(nèi)容必須為字符串,不能為int值或其他
用途:寫(xiě)操作
f.write('nihaoya\nhaojiubujianle\r\nnizuijinhaoma\r')
- readlines
語(yǔ)法:readlines(hint:int)
參數(shù)解釋?zhuān)篽int:字節(jié),如果0<字節(jié)<=文件第一行的字節(jié)數(shù),則返回的列表中只有一個(gè)元素為第一行的全部數(shù)據(jù),如果文件第一行的字節(jié)<字節(jié)<=文件第二行的字節(jié),則返回的列表中有兩個(gè)元素為前兩行的全部數(shù)據(jù),以此類(lèi)推。如果字節(jié)<=0,則返回全部?jī)?nèi)容
用途:按行讀取文件,返回一個(gè)列表,列表中的每個(gè)元素存放的是文件中的每行內(nèi)容
print(f.readlines(7)) # ['nihaoya\n']
print(f.readlines(23)) # ['nihaoya\n', 'haojiubujianle\r\n']
print(f.readlines()) # ['nihaoya\n', 'haojiubujianle\r\n', 'nizuijinhaoma\r']
- writelines
語(yǔ)法:writelines(lines:iterable[Anystr])
參數(shù)解釋?zhuān)簂ines:列表,列表中的每個(gè)元素都得是字符串類(lèi)型,遍歷列表中的元素寫(xiě)入到文件中
用途:一次性向文件中寫(xiě)入一序列的內(nèi)容,如果需要換行需手動(dòng)指定換行符
f.writelines(['nihaoya\n','haojiubujianle\r\n','nizuijinhaoma\r'])
- readline
語(yǔ)法:readline(limit:int)
參數(shù)解釋?zhuān)簂imit:字節(jié),如果該行的字節(jié)數(shù)>字節(jié)>=0,則輸出指定字節(jié)的元素,如果字節(jié)數(shù)小于0則輸出該行全部?jī)?nèi)容,如果字節(jié)數(shù)大于等于改行的字節(jié)數(shù)則輸出該行的全部?jī)?nèi)容
用途:按行讀取文件,每調(diào)用一次就是讀取一行文件。讀取文件時(shí)每行都會(huì)輸出
print(f.readline(2)) # ni
print(f.readline()) # nihaoya
print(f.readline(0)) # 啥也沒(méi)有
print(f.readline(-2)) # nihaoya
print(f.readline(23)) # nihaoya
- seek
語(yǔ)法:seek(offset:int,whence:int)
參數(shù)解釋?zhuān)?br> offset:偏移量,需要移動(dòng)偏移的字節(jié)數(shù)。
whence:指定從哪個(gè)位置開(kāi)始偏移。
0:從文件開(kāi)頭開(kāi)始偏移
1:從當(dāng)前位置開(kāi)始偏移
2:從文件末尾開(kāi)始偏移
用途:用于移動(dòng)文件讀取指針到指定位置。
# nihaoya\n
f.seek(2,0)
print(f.readline(2)). # ha
- flush
語(yǔ)法:flush()
用途:刷新文件內(nèi)部緩沖,直接把內(nèi)部緩沖區(qū)的數(shù)據(jù)立刻寫(xiě)入文件, 而不是被動(dòng)的等待輸出緩沖區(qū)寫(xiě)入。在close文件之前就可以寫(xiě)入到文件中,如果沒(méi)有flush則需要等調(diào)用close之后文件中才會(huì)出現(xiàn) - isatty
語(yǔ)法:isatty()
用途:如果文件連接到一個(gè)終端設(shè)備返回 True,否則返回 False。 - readable、writable
語(yǔ)法:readable()、writable()
用途:返回bool值,readable判斷文件是否可讀,若有讀權(quán)限則返回True。writable判斷文件是否可寫(xiě),若有寫(xiě)權(quán)限則返回True
f = open('test.txt', 'w', 10, None, None, '')
print(f.writable()) # True
print(f.readable()) # False
- tell
語(yǔ)法:tell()
用途:返回文件指針當(dāng)前所在位置。
print(f.tell()) #0
f.seek(2,0)
print(f.tell()) #2 先從文件開(kāi)頭處偏移了兩個(gè)字節(jié),故位置變?yōu)?
- truncate
語(yǔ)法:truncate(size:int)
參數(shù)解釋?zhuān)喝绻嬖趧t文件截?cái)酁?size 字節(jié)。
用途:截取文件,截取的字節(jié)通過(guò)size指定,默認(rèn)為當(dāng)前文件位置。
f = open('test.txt', 'r+', 1, None, None)
f.truncate(2)
print(f.read()) # ni
該方法的應(yīng)用場(chǎng)景為r+或a,先截取后讀,截取后文件中的內(nèi)容也會(huì)被刷新為截取的字符串,如果在w+模式會(huì)填充為兩個(gè)空串,因?yàn)閣為覆蓋模式。如下image.png
