文件操作的初識(shí)

          *
          用 python 代碼對(duì)文件進(jìn)行各種操作。

          基本構(gòu)成:

          * 文件路徑:path
          * 打開方式:讀、寫、追加、讀寫、寫讀……
          * 編碼方式:utf-8 / gbk / gb2312…… f = open('文件路徑或者相對(duì)路',encoding='編碼方式',mode='模式')
          # 格式構(gòu)成 cotent = f.read() print(content) f.close()
          *
          代碼解釋:

          *
          open:

          ? 內(nèi)置函數(shù),open 底層調(diào)用的是操作系統(tǒng)的接口。

          *
          f:

          ?
          變量,約定俗成的變量名有(f1,fh,file_handler,f_h),這個(gè)變量還有一個(gè)名字,叫文件句柄。對(duì)亠件進(jìn)行的任何操作,都得通過文件句柄加'.'的方式。

          *
          encoding:

          ? 可以不寫,如果不寫,默認(rèn)的編碼本就是系統(tǒng)默認(rèn)的編碼。

          ? Windows: gkb

          ? Linux: utf-8

          ? MacOS: utf-8

          *
          mode:

          ? 就是定義你的操作方式:r 為讀模式。

          *
          f.read():

          ? 你想操作文件,比如讀文件,給文件寫內(nèi)容,等等,都必須通過文件句柄進(jìn)行操作。

          *
          f.colse():

          ? 關(guān)閉文件。(必須關(guān)閉,否則會(huì)常駐內(nèi)存。)

          *
          文件操作的三個(gè)步驟:

          *
          打開文件。

          *
          對(duì)文件句柄進(jìn)行相應(yīng)的操作。

          *
          關(guān)閉文件。
          # 打開文件,得到文件句柄并賦值給一個(gè)變量 f = open('文件.txt', 'r', encoding='utf-8') # 默認(rèn)打開模式就為 r #
          通過句柄對(duì)文件進(jìn)行操作 date = f.read() # 關(guān)閉文件 f.close()
          *
          報(bào)錯(cuò)的原因:

          *
          UnicodeDecodeError:文件存儲(chǔ)時(shí)與文件打開時(shí)編碼本不一致。

          *
          路徑分隔符產(chǎn)生的問題:
          解決方法:在路徑前加個(gè) r r'C:\Users\Desktop\文件.txt'
          文件操作的:讀

          ? 文件操作的讀,有四種模式(r、rb、r+、r+b),r+ 和 r+b 不常用, rb
          操作的是非文本的文件,比如:圖片、視頻、音頻。每種模式有五種方法(read()、read(n)、readline()、readlines()、for)。

          *
          r 模式

          ? 以只讀方式打開文件,文件的指針將會(huì)放在文件的開頭。是文件操作最常用的模式,也是默認(rèn)模式,如果一個(gè)文件不設(shè)置mode,那么默認(rèn)使用r模式操作文件。

          舉例:
          f = open('文件.txt', mode='r', encoding='utf-8') msg = f.read() f.close()
          print(msg)
          *
          read() 一次性全部讀取

          read() 將文件中的內(nèi)容全部讀取出來; 弊端:如果文件很大就會(huì)非常的占用內(nèi)存,容易導(dǎo)致內(nèi)存崩潰。
          f = open('測(cè)試', mode='r', encoding='utf-8') msg = f.read() f.close() print(msg)
          # 輸出結(jié)果: 這是一行測(cè)試 A:這是第二行 B:這是第三行 C:這是第幾行 D:這是我也不知道第幾行 就這么地吧.
          *
          read(n) 指定讀取到什么位置

          在 r 模式下,n 按照字符讀取
          f = open('測(cè)試', mode='r', encoding='utf-8') msg = f.read(4) f.close()
          print(msg) # 輸出結(jié)果: 這是一行
          *
          readline() 按行讀取

          readline() 每次只讀取一行,注意: readline()
          讀取出來的數(shù)據(jù)在后面都有一個(gè)\n,解決這個(gè)問題只需要在我們讀取出來的文件后邊加一個(gè)strip()就OK了
          f = open('測(cè)試', mode='r', encoding='utf-8') msg1 = f.readline() msg2 =
          f.readline().strip() msg3 = f.readline() msg4 = f.readline() f.close()
          print(msg1) print(msg2) print(msg3) print(msg4) # 輸出結(jié)果: 這是一行測(cè)試 A:這是第二行 B:這是第三行
          C:這是第幾行
          *
          readlines() 返回一個(gè)列表

          readlines() 返回一個(gè)列表,列表里面每個(gè)元素是原文件的每一行,如果文件很大,占內(nèi)存,容易崩盤。
          f = open('測(cè)試', mode='r', encoding='utf-8') print(f.readlines()) # 還可以這么寫的,哈哈
          f.close() # 輸出結(jié)果: ['這是一行測(cè)試\n', 'A:這是第二行\(zhòng)n', 'B:這是第三行\(zhòng)n', 'C:這是第幾行\(zhòng)n',
          'D:這是我也不知道第幾行\(zhòng)n', '就這么地吧.']
          上面這四種都不太好,如果文件超大,內(nèi)容超多,他們就很容易將內(nèi)存撐爆,所以,我們還有第五種方法。

          *
          for 循環(huán)

          可以通過for循環(huán)去讀取,文件句柄是一個(gè)迭代器,他的特點(diǎn)就是每次循環(huán)只在內(nèi)存中占一行的數(shù)據(jù),非常節(jié)省內(nèi)存。
          f = open('測(cè)試', mode='r', encoding='utf-8') for line in f: print(line) # 去掉 \n
          可以這樣寫: print(line.strip()) # 這種方式就是在一行一行的進(jìn)行讀取,它就執(zhí)行了下邊的功能 '''
          print(f.readline()) print(f.readline()) print(f.readline()) ....... ''' # 輸出結(jié)果:
          這是一行測(cè)試 A:這是第二行 B:這是第三行 C:這是第幾行 D:這是我也不知道第幾行 就這么地吧.
          特別注意: 讀完的文件一定必須要關(guān)閉

          *
          rb 模式


          rb模式:以二進(jìn)制格式打開一個(gè)文件用于只讀。文件指針將會(huì)放在文件的開頭。記住下面講的也是一樣,帶b的都是以二進(jìn)制的格式操作文件,他們主要是操作非文字文件:圖片,音頻,視頻等,
          并且如果你要是帶有b的模式操作文件,那么不用聲明編碼方式。
          f1 = open('圖片.jpeg', mode='rb') tu = f1.read() f1.close() print(tu) # 輸出結(jié)果:
          b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00H\x00H\x00\x00\xff\xe1\x00\xb0Exif\x............后面還有.老長(zhǎng)老長(zhǎng)了..此處省略了.
          rb模式也有read read(n) readline(),readlines() for循環(huán)這幾種方法,這里就不一一演示了。

          文件操作的:寫

          ? 文件操作的寫,有四種模式(w、wb、w+、w+b),w+ 和 w+b 不常用, wb
          操作的是非文本的文件,比如:圖片、視頻、音頻。操作方法是:write('要寫入的內(nèi)容')

          *
          w 模式

          如果文件不存在,用 w 模式操作文件,它會(huì)先創(chuàng)建文件,然后寫入內(nèi)容。
          f = open('這是一個(gè)新創(chuàng)建的文件', encoding='utf-8', mode='w') f.write('果然是一個(gè)新創(chuàng)建的文件')
          f.close()
          如果文件存在,利用w模式操作文件,先清空原文件內(nèi)容,在寫入新內(nèi)容。
          f = open('這是一個(gè)新創(chuàng)建的文件', encoding='utf-8', mode='w') f.write('這是清空后重新寫入的內(nèi)容')
          f.close()
          *
          wb 模式


          wb模式:以二進(jìn)制格式打開一個(gè)文件只用于寫入。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內(nèi)容會(huì)被刪除。如果該文件不存在,創(chuàng)建新文件。一般用于非文本文件如:圖片,音頻,視頻等。

          >>舉個(gè)例子 :


          我先以rb的模式將一個(gè)圖片的內(nèi)容以bytes類型全部讀取出來,然后在以wb將全部讀取出來的數(shù)據(jù)寫入一個(gè)新文件,這樣我就完成了類似于一個(gè)圖片復(fù)制的流程。具體代碼如下:
          # 第一步:將原圖片通過 rb 模式讀取出來。 f = open('圖片.jpeg', mode='rb') content = f.read()
          f.close() # 第二步:將讀取出來的數(shù)據(jù)通過 wb 模式寫入新文件。 f1 = open('圖片1.jpeg', mode='wb')
          f1.write(content) f1.close()
          文件操作的:追加

          就是在文件中追加內(nèi)容。這里也有四種文件分類主要四種模式:a,ab,a+,a+b,我們只講a

          *
          a 模式

          如果文件不存在,利用a模式操作文件,那么它會(huì)先創(chuàng)建文件,然后寫入內(nèi)容。
          f = open('追加文本', encoding='utf-8', mode='a') f.write('這個(gè)文件是沒有的,我是新創(chuàng)建的')
          f.close()
          如果文件存在,利用a模式操作文件,那么它會(huì)在文件的最后面追加內(nèi)容。
          f = open('追加文本', encoding='utf-8', mode='a') f.write('這是己存在的文件,我是新追加的內(nèi)容')
          f.close()
          文件操作的其它模式

          ?
          咱們還有一種模式?jīng)]有講,就是那種帶+號(hào)的模式。什么是帶+的模式呢?+就是加一個(gè)功能。比如剛才講的r模式是只讀模式,在這種模式下,文件句柄只能進(jìn)行類似于read的這讀的操作,而不能進(jìn)行write這種寫的操作。所以我們想讓這個(gè)文件句柄既可以進(jìn)行讀的操作,又可以進(jìn)行寫的操作,那么這個(gè)如何做呢?這就是接下來要說這樣的模式:r+
          讀寫模式,w+寫讀模式,a+寫讀模式,r+b 以bytes類型的讀寫模式.........
          在這里咱們只講一種就是r+,其他的大同小異,自己可以練練就行了。
          #1. 打開文件的模式有(默認(rèn)為文本模式): r,只讀模式【默認(rèn)模式,文件必須存在,不存在則拋出異?!?w,只寫模式【不可讀;不存在則創(chuàng)建;存在則清空內(nèi)容】
          a, 只追加寫模式【不可讀;不存在則創(chuàng)建;存在則只追加內(nèi)容】 #2.
          對(duì)于非文本文件,我們只能使用b模式,"b"表示以字節(jié)的方式操作(而所有文件也都是以字節(jié)的形式存儲(chǔ)的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式)
          rb wb ab 注:以b方式打開時(shí),讀取到的內(nèi)容是字節(jié)類型,寫入時(shí)也需要提供字節(jié)類型,不能指定編碼 #3,‘+’模式(就是增加了一個(gè)功能)
          r+,讀寫【可讀,可寫】 w+,寫讀【可寫,可讀】 a+,寫讀【可寫,可讀】 #4,以bytes類型操作的讀寫,寫讀,寫讀模式 r+b,讀寫【可讀,可寫】
          w+b,寫讀【可寫,可讀】 a+b,寫讀【可寫,可讀】
          *
          r+ 模式 讀并追加 順序不能錯(cuò)

          r+: 打開一個(gè)文件用于讀寫。文件指針默認(rèn)將會(huì)放在文件的開頭。
          f = open('文件的讀寫.txt', encoding='utf-8', mode='r+') content = f.read()
          print(content) f.write('這是新寫入的內(nèi)容') f.close()
            
          注意:如果你在讀寫模式下,先寫后讀,那么文件就會(huì)出問題,因?yàn)槟J(rèn)光標(biāo)是在文件的最開始,你要是先寫,則寫入的內(nèi)容會(huì)講原內(nèi)容覆蓋掉,直到覆蓋到你寫完的內(nèi)容,然后在后面開始讀取。

          小總結(jié):

          ? 三個(gè)大方向:
          ? 讀, 四種模式: r rb r+ r+b
          ? 寫, 四種模式 : w,wb, w+,w+b
          ? 追加 四種模式: a, ab, a+,a+b

          ? 相應(yīng)的功能:
          ? 對(duì)文件句柄的操作:read read(n) readline() readlines() write()

          文件操作的其它功能

          *
          f.tell() 獲取光標(biāo)的位置 單位是:字節(jié)
          f = open('測(cè)試', encoding='utf-8', mode='r') print(f.tell()) content = f.read()
          print(f.tell()) f.close() # 原文件內(nèi)容 這是一行測(cè)試 A:這是第二行 B:這是第三行 C:這是第幾行 D:這是我也不知道第幾行
          就這么地吧. # 輸出結(jié)果: 0 # 開始的位置 122 # 結(jié)束的位置
          *
          f.seek() 調(diào)整光標(biāo)的位置 (注意:移動(dòng)單位是byte , 如果是utf-8的中文部分要是3的倍數(shù))
          f = open('測(cè)試', encoding='utf-8', mode='r') f.seek(9) content = f.read()
          print(content) f.close() # 原文件內(nèi)容 這是一行測(cè)試 A:這是第二行 B:這是第三行 C:這是第幾行 D:這是我也不知道第幾行
          就這么地吧. # 輸出結(jié)果: 行測(cè)試 A:這是第二行 B:這是第三行 C:這是第幾行 D:這是我也不知道第幾行 就這么地吧.
          *
          f.flush() 強(qiáng)制刷新
          f = open('測(cè)試', encoding='utf-8', mode='w') f.write('fafdsfsfsadfsaf')
          f.flush() f.close()
          打開文件的另一種方式(常用的是這種)

          *
          with open() as ....
          # 優(yōu)點(diǎn)1:不用手動(dòng)關(guān)閉文件句柄 # 利用with上下文管理這種方式,它會(huì)自動(dòng)關(guān)閉文件句柄。 with open('測(cè)試',
          encoding='utf-8', mode='r') as f: print(f.read()) # 優(yōu)點(diǎn)2:可以加多個(gè) open 操作 # 一個(gè)with
          語(yǔ)句可以操作多個(gè)文件,產(chǎn)生多個(gè)文件句柄。 with open('測(cè)試', encoding='utf-8', mode='r') as f,\
          open('測(cè)試', encoding='utf-8', mode='w') as f1: print(f.read())
          f1.write('kckckckckckckkck')
            
          這里要注意一個(gè)問題,雖然使用with語(yǔ)句方式打開文件,不用你手動(dòng)關(guān)閉文件句柄,比較省事兒,但是依靠其自動(dòng)關(guān)閉文件句柄,是有一段時(shí)間的,這個(gè)時(shí)間不固定,所以這里就會(huì)產(chǎn)生問題,如果你在with語(yǔ)句中通過r模式打開t1文件,那么你在下面又以a模式打開t1文件,此時(shí)有可能你第二次打開t1文件時(shí),第一次的文件句柄還沒有關(guān)閉掉,可能就會(huì)出現(xiàn)錯(cuò)誤,他的解決方式只能在你第二次打開此文件前,手動(dòng)關(guān)閉上一個(gè)文件句柄。

          文件的修改

          ? 文件的數(shù)據(jù)是存放于硬盤上的,因而只存在覆蓋、不存在修改這么一說,我們平時(shí)看到的修改文件,都是模擬出來的效果,具體的說有兩種實(shí)現(xiàn)方式:

          *
          文件操作改的流程:
          1,以讀的模式打開原文件。
          2,以寫的模式創(chuàng)建一個(gè)新文件。
          3,將原文件的內(nèi)容讀出來修改成新內(nèi)容,寫入新文件。
          4,將原文件刪除。
          5,將新文件重命名成原文件。

          *
          方式一:將硬盤存放的該文件的內(nèi)容全部加載到內(nèi)存,在內(nèi)存中是可以修改的,修改完畢后,再由內(nèi)存覆蓋到硬盤(word,vim,nodpad++等編輯器)
          import os # 調(diào)用系統(tǒng)模塊 with open('測(cè)試', encoding='utf-8') as f1,\ open('測(cè)試.bak',
          encoding='utf-8',mode='w') as f2: old_content = f1.read() # 全部讀入內(nèi)存,如果文件很大,會(huì)卡死
          new_content = old_content.replace('文', 'wen') # 在內(nèi)存中完成修改 f2.write(new_content)
          # 一次性寫入新文件 os.remove('測(cè)試') # 刪除原文件 os.rename('測(cè)試.bak', '測(cè)試') # 將新建的文件重命名為原文件 #
          原文件內(nèi)容 **文件操作改的流程:** 1,以讀的模式打開原文件。 2,以寫的模式創(chuàng)建一個(gè)新文件。 3,將原文件的內(nèi)容讀出來修改成新內(nèi)容,寫入新文件。
          4,將原文件刪除。 5,將新文件重命名成原文件。 # 修改后的內(nèi)容 **wen件操作改的流程:** 1,以讀的模式打開原wen件。
          2,以寫的模式創(chuàng)建一個(gè)新wen件。 3,將原wen件的內(nèi)容讀出來修改成新內(nèi)容,寫入新wen件。 4,將原wen件刪除。 5,將新wen件重命名成原wen件。
          *
          方式二:將硬盤存放的該文件的內(nèi)容一行一行地讀入內(nèi)存,修改完畢就寫入新文件,最后用新文件覆蓋源文件(這種是常用的)
          import os with open('測(cè)試', encoding='utf-8') as f1,\ open('測(cè)試.bak',
          encoding='utf-8',mode='w') as f2: for line in f1: # 一行一行的改,占內(nèi)存少 new_line =
          line.replace('wen', '文') f2.write(new_line) os.remove('測(cè)試') os.rename('測(cè)試.bak',
          '測(cè)試') # 原文件內(nèi)容 **wen件操作改的流程:** 1,以讀的模式打開原wen件。 2,以寫的模式創(chuàng)建一個(gè)新wen件。
          3,將原wen件的內(nèi)容讀出來修改成新內(nèi)容,寫入新wen件。 4,將原wen件刪除。 5,將新wen件重命名成原wen件。 # 修改后的內(nèi)容
          **文件操作改的流程:** 1,以讀的模式打開原文件。 2,以寫的模式創(chuàng)建一個(gè)新文件。 3,將原文件的內(nèi)容讀出來修改成新內(nèi)容,寫入新文件。 4,將原文件刪除。
          5,將新文件重命名成原文件。

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                久热最新网址 | 骚逼娇妻 | 欧美精产国品一二三区 | 国产色情在线观看 | 操逼捰大鸡八视频 |