python基礎(chǔ)——文件操作

image.png

python基礎(chǔ)

文件的基本操作

文件操作步驟

以word文檔為例,打開(kāi)一個(gè)文件需要經(jīng)過(guò)以下幾個(gè)步驟:

  1. 打開(kāi)
  2. 讀或?qū)懟蚱渌僮?/li>
  3. 關(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容