Python 文件的操作
一,初識文件操作。
引子:
現在這個世界上,如果可以操作文件的所有軟件都消失了,比如word,wps等等,此時你的朋友通過qq給你發過來一個文件,文件名是:美女模特空姐護士聯系方式.txt,在座的所有男同學,那么你接受到這個文件之后,你的內心是否有一絲沖動,當然咱們不是那種悶騷的人,其實我們就是比較好奇,就是想要看看里面寫的是什么,僅此而已,絕不聯系。但是我說了所有可以操作文件的軟件全部都沒了,那么你是不是百爪撓心,火急火燎,哎呀。別急呀,你忘了么?你學過Python這門編程語言,這個語言肯定有能操控文件的功能。我相信在這種強大的動力下,你是可以,必須能學會的。
那么假設,現在讓你用Python開發一個軟件來操作這個文件,你覺得你需要什么必要參數呢?
文件路徑:D:\美女模特空姐護士聯系方式.txt? (你想操作這個文件,必須要知道這個文件的位置)
編碼方式:utf-8,gbk,gb2312....? (昨天剛講完編碼,文件其實就是數據的存儲,數據存儲你需要編碼知道這個數據是以什么編碼存儲的)
操作模式:只讀,只寫,追加,寫讀,讀寫....
計算機系統分為:計算機硬件,操作系統,應用程序三部分。 我們用python或其他語言編寫的應用程序若想要把數據永久保存下來,必須要保存于硬盤中, 這就涉及到應用程序要操作硬件,眾所周知,應用程序是無法直接操作硬件的,這就用到了操作系統。 操作系統把復雜的硬件操作封裝成簡單的接口給用戶/應用程序使用, 其中文件就是操作系統提供給應用程序來操作硬盤虛擬概念,用戶或應用程序通過操作文件,可以將自己的數據永久保存下來。 文件操作的內容流程
此時你需要先利用軟件創建一個文件,文件里面隨便寫一些內容,然后保存在任意磁盤(路徑盡量要簡單一些)中。
然后創建一個py文件,利用Python代碼打開這個文件。
file1?=?open("/home/yuchuan/YuchuanData/PythonData/temp/china.txt",?mode="r",?encoding="utf-8") content?=?file1.read() print(content) file1.close()
結果
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py 101?ways?to?Learn?English Don't?be?afraid?to?make?mistakes.?... Surround?yourself?in?English.?... Practise?every?day.?... Tell?your?family?and?friends?about?your?study?plan.?... Practise?the?4?core?skills:?reading,?writing,?speaking?and?listening.?... Keep?a?notebook?of?new?words?you?learn. Process?finished?with?exit?code?0
接下來就是對上面代碼的解釋: ????file1:?就是一個變量,一般都會將它寫成f,f_obj,file,f_handler,fh,等,它被稱作文件句柄。 ????open:是Python調用的操作系統(windows,linux,等)的功能。 ????"/home/yuchuan/YuchuanData/PythonData/temp/china.txt":?這個是文件的路徑。 ????mode:?就是定義你的操作方式:r為讀模式。 ????encoding:?不是具體的編碼或者解碼,他就是聲明:此次打開文件使用什么編碼本。一般來說:你的文件用什么編碼保存的,就用什么方法打開,一般都是用utf-8(有些使用的是gbk)。 ????f.read():你想操作文件,比如讀文件,給文件寫內容,等等,都必須通過文件句柄進行操作。 ????close():?關閉文件句柄(可以把文件句柄理解成一個空間,這個空間存在內存中,必須要主動關閉)。 上面的參數解釋
有了文件的概念,我們無需再去考慮操作硬盤的細節,只需要關注操作文件的流程:
#?1、打開文件,得到文件句柄,并且復制給一個變量。默認打開模式九尾r。 file1?=?open("/home/yuchuan/YuchuanData/PythonData/temp/china.txt",?mode="r",?encoding="utf-8") #?2、通過句柄操作文件。 content?=?file1.read() print(content) #?3、關閉文件 file1.close()
1. 路徑問題。
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py Traceback?(most?recent?call?last): ??File?"/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py",?line?2,?in?
沒有匹配的文件或目錄:No such file or directory: 路徑錯誤或者是沒有此文件名的文件。
你的的路徑里面的\與后面的字符產生了某種'化學反應',這個截圖中的\D此時\就不是路徑分隔符了,\D就有了特殊意義,其實跟\t,\n,換行符一樣,所以針對這種情況,你應該這樣解決:
解決方式一:?'C:\Users\金鑫\Desktop\111.txt' 凡是路徑會發生化學反應的地方,多加一個\ 這樣就是前面\對后面的\進行轉譯,告訴計算機這個只是想單純的表示\路徑而已。
解決方式二: r'C:\Users\金鑫\Desktop\111.txt' 在路徑的整體前面加一個r。(推薦)
相對路徑與絕對路徑:
1.絕對路徑:從磁盤根目錄開始一直到文件名
2.相對路徑:用一個文件夾下的文件,相對于當前這個程序所在的文件而言.如果在同一個文件中,則相對路勁就是這個文件名.如果再上一層文件夾則要使用../相對路徑下,你就可以直接寫文件名即可。
2. 編碼的問題
這個問題就是你打開文件的編碼與文件存儲時的編碼用的編碼本不一致導致的。比如這個文件當時用word軟件保存時,word軟件默認的編碼為utf-8,但是你利用python代碼打開時,用的gbk,那么這個就會報錯了。
文件操作的操作模式分為三個類:讀,寫,追加。每一類又有一些具體的方法,那么接下來我們就分類研究這些方法。
二. 文件操作:讀
以只讀方式打開文件,文件的指針將會放在文件的開頭。是文件操作最常用的模式,也是默認模式,如果一個文件不設置mode,那么默認使用r模式操作文件。
舉例說明:
#?1、打開文件,得到文件句柄,并且復制給一個變量。默認打開模式九尾r。 file1?=?open("/home/yuchuan/YuchuanData/PythonData/temp/china.txt",?encoding="utf-8") #?2、通過句柄操作文件。 content?=?file1.read() #?3、關閉文件 file1.close() print(content)
結果
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py 101?ways?to?Learn?English Don't?be?afraid?to?make?mistakes.?... Surround?yourself?in?English.?... Practise?every?day.?... Tell?your?family?and?friends?about?your?study?plan.?... Practise?the?4?core?skills:?reading,?writing,?speaking?and?listening.?... Keep?a?notebook?of?new?words?you?learn. Process?finished?with?exit?code?0
通過上面的例子可以看出來,我將china.txt這個文件的內容全部讀取出來了,那么讀一個文件還可以怎么讀取呢?下面我們研究一下不同的讀文件的方法。
2.1.1 read()
read()將文件中的內容全部讀取出來;弊端 如果文件很大就會非常的占用內存,容易導致內存奔潰.
#?1、打開文件,得到文件句柄,并且復制給一個變量。默認打開模式九尾r。 file1?=?open("/home/yuchuan/YuchuanData/PythonData/temp/china.txt",?mode='r',?encoding="utf-8") #?2、通過句柄操作文件。 content?=?file1.read() #?3、關閉文件 file1.close() print(content)
2.1.2?read(n)
read()讀取的時候指定讀取到什么位置
在r模式下,n按照字符讀取。
#?1、打開文件,得到文件句柄,并且復制給一個變量。默認打開模式九尾r。 file1?=?open("/home/yuchuan/YuchuanData/PythonData/temp/china.txt",?mode='r',?encoding="utf-8") #?2、通過句柄操作文件。 content?=?file1.read(10) content1?=?file1.read() #?3、關閉文件 file1.close() print(content) print(content1)
結果
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py 101?ways?t????#content o?Learn?English Don't?be?afraid?to?make?mistakes.?... Surround?yourself?in?English.?... Practise?every?day.?... Tell?your?family?and?friends?about?your?study?plan.?... Practise?the?4?core?skills:?reading,?writing,?speaking?and?listening.?... Keep?a?notebook?of?new?words?you?learn. Process?finished?with?exit?code?0
2.1.3?readline()
readline()讀取每次只讀取一行,注意點:readline()讀取出來的數據在后面都有一個\n
#?1、打開文件,得到文件句柄,并且復制給一個變量。默認打開模式九尾r。 file1?=?open("/home/yuchuan/YuchuanData/PythonData/temp/china.txt",?mode='r',?encoding="utf-8") #?2、通過句柄操作文件。 msg1?=?file1.readline() msg2?=?file1.readline() msg3?=?file1.readline() msg4?=?file1.readline() msg5?=?file1.readline() #?3、關閉文件 file1.close() print(msg1) print(msg2) print(msg3) print(msg4) print(msg5)
結果
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py 101?ways?to?Learn?English Don't?be?afraid?to?make?mistakes.?... Surround?yourself?in?English.?... Practise?every?day.?... Tell?your?family?and?friends?about?your?study?plan.?... Process?finished?with?exit?code?0
解決這個問題只需要在我們讀取出來的文件后邊加一個strip()就OK了
#?1、打開文件,得到文件句柄,并且復制給一個變量。默認打開模式九尾r。 file1?=?open("/home/yuchuan/YuchuanData/PythonData/temp/china.txt",?mode='r',?encoding="utf-8") #?2、通過句柄操作文件。 msg1?=?file1.readline().strip() msg2?=?file1.readline().strip() msg3?=?file1.readline().strip() msg4?=?file1.readline().strip() msg5?=?file1.readline().strip() #?3、關閉文件 file1.close() print(msg1) print(msg2) print(msg3) print(msg4) print(msg5)
結果
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py 101?ways?to?Learn?English Don't?be?afraid?to?make?mistakes.?... Surround?yourself?in?English.?... Practise?every?day.?... Tell?your?family?and?friends?about?your?study?plan.?... Process?finished?with?exit?code?0
2.1.4 readlines()
readlines() 返回一個列表,列表里面每個元素是原文件的每一行,如果文件很大,占內存,容易崩盤。
#?1、打開文件,得到文件句柄,并且復制給一個變量。默認打開模式九尾r。 file1?=?open("/home/yuchuan/YuchuanData/PythonData/temp/china.txt",?mode='r',?encoding="utf-8") #?2、通過句柄操作文件。 print(file1.readlines()) #?3、關閉文件 file1.close()
結果
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py ['101?ways?to?Learn?English\n',? ?"Don't?be?afraid?to?make?mistakes.?...\n",? ?'Surround?yourself?in?English.?...\n',? ?'Practise?every?day.?...\n',? ?'Tell?your?family?and?friends?about?your?study?plan.?...\n',? ?'Practise?the?4?core?skills:?reading,?writing,?speaking?and?listening.?...\n',? ?'Keep?a?notebook?of?new?words?you?learn.\n' ] Process?finished?with?exit?code?0
上面這四種都不太好,因為如果文件較大,他們很容易撐爆內存,所以接下來我們看一下第五種:
2.1.5?for循環
可以通過for循環去讀取,文件句柄是一個迭代器,他的特點就是每次循環只在內存中占一行的數據,非常節省內存。
#?1、打開文件,得到文件句柄,并且復制給一個變量。默認打開模式九尾r。 file1?=?open("/home/yuchuan/YuchuanData/PythonData/temp/china.txt",?mode='r',?encoding="utf-8") #?2、通過句柄操作文件。 for?line?in?file1: ????print(line.strip()) #?3、關閉文件 file1.close()
結果
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py 101?ways?to?Learn?English Don't?be?afraid?to?make?mistakes.?... Surround?yourself?in?English.?... Practise?every?day.?... Tell?your?family?and?friends?about?your?study?plan.?... Practise?the?4?core?skills:?reading,?writing,?speaking?and?listening.?... Keep?a?notebook?of?new?words?you?learn. Process?finished?with?exit?code?0
注意點:讀完的文件句柄一定要關閉
rb模式:以二進制格式打開一個文件用于只讀。文件指針將會放在文件的開頭。記住下面講的也是一樣,帶b的都是以二進制的格式操作文件,他們主要是操作非文字文件:圖片,音頻,視頻等,并且如果你要是帶有b的模式操作文件,那么不用聲明編碼方式。
可以網上下載一個圖片給同學們舉例:
#?1、打開文件,得到文件句柄,并且復制給一個變量。默認打開模式九尾r。 fd?=?open("/home/yuchuan/Pictures/004.png",?mode="rb") for?line?in?fd: ????print(line) fd.close() #?1、打開文件,得到文件句柄,并且復制給一個變量。默認打開模式九尾r。 fd?=?open("/home/yuchuan/Pictures/004.png",?mode="rb") msg?=?fd.read() print(msg) #for?line?in?fd: #????print(line) fd.close()
結果
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02\xb4\x00\x00\x02\xb3\x08\x06\x00\x00\x00\xef;12\x90@\x1b\xdd\xbaU\xc9D@\x04j\x89\xc0\x0e;...... Process?finished?with?exit?code?0
當然rb模式也有read read(n) readline(),readlines() for循環這幾種方法,我在這就不一一演示了。
三. 文件操作:寫
第二類就是寫,就是在文件中寫入內容。這里也有四種文件分類主要四種模式:w,wb,w+,w+b,我們只講w,wb。
3.1 w模式
如果文件不存在,利用w模式操作文件,那么它會先創建文件,然后寫入內容.
fd?=?open("demo001.txt",?mode="w",?encoding="utf-8") str1?=?"世界你好" fd.write(str1) fd.close()
結果
如果文件存在,利用w模式操作文件,先清空原文件內容,在寫入新內容。
fd?=?open("demo001.txt",?mode="w",?encoding="utf-8") str2?="美好的明天才剛剛開始,請珍惜每一天" fd.write(str2) fd.close()
運行前:
運行后:
3.2?wb模式
wb模式:以二進制格式打開一個文件只用于寫入。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用于非文本文件如:圖片,音頻,視頻等。
舉例說明:
我先以rb的模式將一個圖片的內容以bytes類型全部讀取出來,然后在以wb將全部讀取出來的數據寫入一個新文件,這樣我就完成了類似于一個圖片復制的流程。具體代碼如下:
fd1?=?open("/home/yuchuan/Pictures/001.png",?mode="rb") fd2?=?open("/home/yuchuan/Pictures/111.png",?mode="wb") flag?=?1 while?flag: ????content?=?fd1.readline() ????fd2.write(content) ????if?not?content:??#?等價于if?content?==?"": ????????flag?=?0 fd1.close() fd2.close()
結果:
四. 文件操作:追加
第三類就是追加,就是在文件中追加內容。這里也有四種文件分類主要四種模式:a,ab,a+,a+b,我們只講a。
4.1 a模式
打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。
如果文件不存在,利用a模式操作文件,那么它會先創建文件,然后寫入內容。
fd?=?open("demo002.txt",?mode="a+",?encoding="utf-8") str1?=?"努力才能突破,突破自己" fd.write(str1) fd.close()
結果:
如果文件存在,利用a模式操作文件,那么它會在文件的最后面追加內容。
fd?=?open("demo002.txt",?mode="a+",?encoding="utf-8") str2?=?"繼續接著努力,成功飛躍" fd.write(str2) fd.close()
結果:
五. 文件操作的其他模式
大家發現了沒有,咱們還有一種模式沒有講,就是那種帶+號的模式。什么是帶+的模式呢?+就是加一個功能。比如剛才講的r模式是只讀模式,在這種模式下,文件句柄只能進行類似于read的這讀的操作,而不能進行write這種寫的操作。所以我們想讓這個文件句柄既可以進行讀的操作,又可以進行寫的操作,那么這個如何做呢?這就是接下來要說這樣的模式:r+ 讀寫模式,w+寫讀模式,a+寫讀模式,r+b 以bytes類型的讀寫模式.........
在這里咱們只講一種就是r+,其他的大同小異,自己可以練練就行了。
#1.?打開文件的模式有(默認為文本模式): r?,只讀模式【默認模式,文件必須存在,不存在則拋出異常】 w,只寫模式【不可讀;不存在則創建;存在則清空內容】 a,?只追加寫模式【不可讀;不存在則創建;存在則只追加內容】 #2.?對于非文本文件,我們只能使用b模式,"b"表示以字節的方式操作(而所有文件也都是以字節的形式存儲的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式) rb? wb ab 注:以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型,不能指定編碼 #3,‘+’模式(就是增加了一個功能) r+,?讀寫【可讀,可寫】 w+,寫讀【可寫,可讀】 a+,?寫讀【可寫,可讀】 #4,以bytes類型操作的讀寫,寫讀,寫讀模式 r+b,?讀寫【可讀,可寫】 w+b,寫讀【可寫,可讀】 a+b,?寫讀【可寫,可讀】
r+: 打開一個文件用于讀寫。文件指針默認將會放在文件的開頭。
fd?=?open("demo002.txt",?mode="r+",?encoding="utf-8") content1?=?fd.read() print(content1) str1?=?"。快快樂樂繼續前進" fd.write(str1) fd.close()
結果:
注意:如果你在讀寫模式下,先寫后讀,那么文件就會出問題,因為默認光標是在文件的最開始,你要是先寫,則寫入的內容會講原內容覆蓋掉,直到覆蓋到你寫完的內容,然后在后面開始讀取。
六. 文件操作的其他功能
6.1 read(n)
1. 文件打開方式為文本模式時,代表讀取n個字符
2. 文件打開方式為b模式時,代表讀取n個字節
6.2 seek()
seek(n)光標移動到n位置,注意: 移動單位是byte,所有如果是utf-8的中文部分要是3的倍數
通常我們使用seek都是移動到開頭或者結尾
移動到開頭:seek(0)
移動到結尾:seek(0,2) seek的第二個參數表示的是從哪個位置進行偏移,默認是0,表示開頭,1表示當前位置,2表示結尾
f?=?open("demo002.txt",?mode="r+",?encoding="utf-8") f.seek(0)??#?光標移動到開頭 content?=?f.read()??#?讀取內容,?此時光標移動到結尾 print(content) f.seek(0)??#?再次將光標移動到開頭 f.seek(0,?2)??#?將光標移動到結尾 content2?=?f.read()??#?讀取內容.?什么都沒有 print(content2) f.seek(0)??#?移動到開頭 f.write("肥腦梨")??#?寫入信息.?此時光標在9?中文3?*?3個?=?9 f.flush() f.close()
結果:
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py 肥腦梨能突破,突破自己繼續接著努力,成功飛躍快快樂樂繼續前進。快快樂樂繼續前進 Process?finished?with?exit?code?0
6.3 tell()
使用tell()可以幫我們獲取當前光標在什么位置
f?=?open("demo002.txt",?mode="r+",?encoding="utf-8") f.seek(0)??#?光標移動到開頭 content?=?f.read()??#?讀取內容,?此時光標移動到結尾 print(content) f.seek(0)??#?再次將光標移動到開頭 f.seek(0,?2)??#?將光標移動到結尾 content2?=?f.read()??#?讀取內容.?什么都沒有 print(content2) f.seek(0)??#?移動到開頭 f.write("肥腦梨")??#?寫入信息.?此時光標在9?中文3?*?3個?=?9 print(f.tell())??#?光標在9這個位置 f.flush() f.close()
結果:
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py 肥腦梨能突破,突破自己繼續接著努力,成功飛躍快快樂樂繼續前進。快快樂樂繼續前進 9 Process?finished?with?exit?code?0
6.4 readable(),writeable()
fd?=?open("demo001.txt",?encoding="utf-8",?mode="r") print(fd.readable()) print(fd.writable()) content?=?fd.read(4096) print(content) fd.close()
結果:
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py True False 美好的明天才剛剛開始,請珍惜每一天 Process?finished?with?exit?code?0
class?TextIOWrapper(_TextIOBase): ????""" ????Character?and?line?based?layer?over?a?BufferedIOBase?object,?buffer. ???? ????encoding?gives?the?name?of?the?encoding?that?the?stream?will?be ????decoded?or?encoded?with.?It?defaults?to?locale.getpreferredencoding(False). ???? ????errors?determines?the?strictness?of?encoding?and?decoding?(see ????help(codecs.Codec)?or?the?documentation?for?codecs.register)?and ????defaults?to?"strict". ???? ????newline?controls?how?line?endings?are?handled.?It?can?be?None,?'', ????'\n',?'\r',?and?'\r\n'.??It?works?as?follows: ???? ????*?On?input,?if?newline?is?None,?universal?newlines?mode?is ??????enabled.?Lines?in?the?input?can?end?in?'\n',?'\r',?or?'\r\n',?and ??????these?are?translated?into?'\n'?before?being?returned?to?the ??????caller.?If?it?is?'',?universal?newline?mode?is?enabled,?but?line ??????endings?are?returned?to?the?caller?untranslated.?If?it?has?any?of ??????the?other?legal?values,?input?lines?are?only?terminated?by?the?given ??????string,?and?the?line?ending?is?returned?to?the?caller?untranslated. ???? ????*?On?output,?if?newline?is?None,?any?'\n'?characters?written?are ??????translated?to?the?system?default?line?separator,?os.linesep.?If ??????newline?is?''?or?'\n',?no?translation?takes?place.?If?newline?is?any ??????of?the?other?legal?values,?any?'\n'?characters?written?are?translated ??????to?the?given?string. ???? ????If?line_buffering?is?True,?a?call?to?flush?is?implied?when?a?call?to ????write?contains?a?newline?character. ????""" ????def?close(self,?*args,?**kwargs):?#?real?signature?unknown ????????關閉文件 ????????pass ????def?fileno(self,?*args,?**kwargs):?#?real?signature?unknown ????????文件描述符?? ????????pass ????def?flush(self,?*args,?**kwargs):?#?real?signature?unknown ????????刷新文件內部緩沖區 ????????pass ????def?isatty(self,?*args,?**kwargs):?#?real?signature?unknown ????????判斷文件是否是同意tty設備 ????????pass ????def?read(self,?*args,?**kwargs):?#?real?signature?unknown ????????讀取指定字節數據 ????????pass ????def?readable(self,?*args,?**kwargs):?#?real?signature?unknown ????????是否可讀 ????????pass ????def?readline(self,?*args,?**kwargs):?#?real?signature?unknown ????????僅讀取一行數據 ????????pass ????def?seek(self,?*args,?**kwargs):?#?real?signature?unknown ????????指定文件中指針位置 ????????pass ????def?seekable(self,?*args,?**kwargs):?#?real?signature?unknown ????????指針是否可操作 ????????pass ????def?tell(self,?*args,?**kwargs):?#?real?signature?unknown ????????獲取指針位置 ????????pass ????def?truncate(self,?*args,?**kwargs):?#?real?signature?unknown ????????截斷數據,僅保留指定之前數據 ????????pass ????def?writable(self,?*args,?**kwargs):?#?real?signature?unknown ????????是否可寫 ????????pass ????def?write(self,?*args,?**kwargs):?#?real?signature?unknown ????????寫內容 ????????pass ????def?__getstate__(self,?*args,?**kwargs):?#?real?signature?unknown ????????pass ????def?__init__(self,?*args,?**kwargs):?#?real?signature?unknown ????????pass ????@staticmethod?#?known?case?of?__new__ ????def?__new__(*args,?**kwargs):?#?real?signature?unknown ????????"""?Create?and?return?a?new?object.??See?help(type)?for?accurate?signature.?""" ????????pass ????def?__next__(self,?*args,?**kwargs):?#?real?signature?unknown ????????"""?Implement?next(self).?""" ????????pass ????def?__repr__(self,?*args,?**kwargs):?#?real?signature?unknown ????????"""?Return?repr(self).?""" ????????pass ????buffer?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?default ????closed?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?default ????encoding?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?default ????errors?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?default ????line_buffering?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?default ????name?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?default ????newlines?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?default ????_CHUNK_SIZE?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?default ????_finalizing?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?default 3.x 3.x所有方法
七. 打開文件的另一種方式
咱們打開文件都是通過open去打開一個文件,其實Python也給咱們提供了另一種方式:with open() as .... 的形式,那么這種形式有什么好處呢?
#?1,利用with上下文管理這種方式,它會自動關閉文件句柄。 with?open('demo002.txt',?encoding='utf-8')?as?f1: ????content1?=?f1.read() ????print(content1) #?2,一個with?語句可以操作多個文件,產生多個文件句柄。 with?open('demo001.txt',?encoding='utf-8')?as?f1,?\ ????????open('demo003.txt',?encoding='utf-8',?mode='r+')?as?f2: ????content2?=?f1.read() ????f2.write('開開心心學習每一天') ????content3?=?f2.read() ????print(content2) ????print(content3)
結果:
/home/yuchuan/YuchuanData/PythonData/PythonProject/venv/bin/python?/home/yuchuan/YuchuanData/PythonData/PythonProject/YuchuanPythonDemo03.py 肥腦梨能突破,突破自己繼續接著努力,成功飛躍快快樂樂繼續前進。快快樂樂繼續前進 美好的明天才剛剛開始,請珍惜每一天 開開心心學習每一天開開心心學習每一天 Process?finished?with?exit?code?0
這里要注意一個問題,雖然使用with語句方式打開文件,不用你手動關閉文件句柄,比較省事兒,但是依靠其自動關閉文件句柄,是有一段時間的,這個時間不固定,所以這里就會產生問題,如果你在with語句中通過r模式打開t1文件,那么你在下面又以a模式打開t1文件,此時有可能你第二次打開t1文件時,第一次的文件句柄還沒有關閉掉,可能就會出現錯誤,他的解決方式只能在你第二次打開此文件前,手動關閉上一個文件句柄。
八. 文件的修改
文件的數據是存放于硬盤上的,因而只存在覆蓋、不存在修改這么一說,我們平時看到的修改文件,都是模擬出來的效果,具體的說有兩種實現方式:
方式一:將硬盤存放的該文件的內容全部加載到內存,在內存中是可以修改的,修改完畢后,再由內存覆蓋到硬盤(word,vim,nodpad++等編輯器)
import?os??#?調用系統模塊 with?open('demo001.txt')?as?read_f,?open('.demo004.txt.swap',?'w')?as?write_f: ????data?=?read_f.read()??#?全部讀入內存,如果文件很大,會很卡 ????data?=?data.replace('明天',?'后天')??#?在內存中完成修改 ????write_f.write(data)??#?一次性寫入新文件 os.remove('demo001.txt')??#?刪除原文件 os.rename('.demo004.txt.swap',?'demo001.txt')??#?將新建的文件重命名為原文件 read_f.close() write_f.close()
結果
方式二:將硬盤存放的該文件的內容一行一行地讀入內存,修改完畢就寫入新文件,最后用新文件覆蓋源文件
import?os with?open('demo002.txt')?as?read_f,?open('.demo004.txt.swap',?'w')?as?write_f: ????for?line?in?read_f: ????????line?=?line.replace('努力',?'奮斗') ????????write_f.write(line) os.remove('demo002.txt') os.rename('.demo004.txt.swap',?'demo002.txt') read_f.close() write_f.close()
結果
練習
1.?文件demo004.txt內容:每一行內容分別為商品名字,價錢,個數。 apple?10?3 tesla?100000?1 mac?3000?2 lenovo?30000?3 chicken?10?3 通過代碼,將其構建成這種數據類型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......]?并計算出總價錢。 2,有如下文件: ------- helen是牛叉叉python發起人,創建人。 helen其實是神人。 誰說helen是sh? 你們真逗,helen再牛逼,也掩飾不住資深屌絲的氣質。 ---------- 將文件中所有的helen都替換成大寫的SH。
人工智能 python 軟件開發云 AI
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。