Python常見文件操作的示例詳解
從文件中讀取數(shù)據(jù)
1:讀取整個文件
首先創(chuàng)建一個文件,它包含一些文本信息,注意:如果該文件為.py文件,則再進(jìn)行操作的時候可以不寫路徑,如果不是.py文件,則必須標(biāo)明路徑。
現(xiàn)在我們創(chuàng)建一個python文件,名為text.py,給他寫入如下文本信息:

下面的程序打開并讀取這個文件,再將其內(nèi)容顯示到屏幕上:
with open('text.py') as pythonProject2:#open(要打開的文件名稱)
#open函數(shù)返回一個表示文件test.py的對象,python將該對象賦給pythonProject2
cc=pythonProject2.read()
print(cc)

python在當(dāng)前執(zhí)行的文件所在目錄中查找指定的文件
關(guān)鍵字 with 在不再需要訪問文件后將其關(guān)閉在這個程序中,注意到我們調(diào)用了 open(),但沒有調(diào)用 close()。也可以調(diào)用 open()和 close()來打開和關(guān)閉文件,但這樣做時,如果程序存在 bug 導(dǎo)致方法 close()未執(zhí)行,文件將不會關(guān)閉。這看似微不足道,但未妥善關(guān)閉文件可能導(dǎo)致數(shù)據(jù)丟失或受損。如果在程序中過早調(diào)用 close(),你會發(fā)現(xiàn)需要使用文件時它已關(guān)閉(無法訪問),這會導(dǎo)致更多的錯誤。并非在任何情況下都能輕松確定關(guān)閉文件的恰當(dāng)時機,但通過使用前面所示的結(jié)構(gòu)(with open(需要打開的文件名稱) as 賦給另一個對象),可讓 Python 去確定:你只管打開文件,并在需要時使用它,Python 自會在合適的時候自動將其關(guān)閉。
細(xì)心的同學(xué)已經(jīng)發(fā)現(xiàn)了,我們上文所輸出的內(nèi)容多了一行空格,原因是:read()到達(dá)文件末尾的時候返回一個空的字符串,而將這個空字符串顯示出來就是一個空格,而想要刪除空行只需要使用我們之前學(xué)習(xí)過的rstrip()函數(shù)。
為什么要提供文件路徑
將類似于 .txt 的簡單文件名傳遞給函數(shù) open()時,Python 將在當(dāng)前執(zhí)行的文件(即物程序文件)所在的目錄中查找。
根據(jù)你組織文件的方式,有時可能要打開不在程序文件所屬目錄中的文件。例如,你可能將程序文件存儲在了文件夾 python_work中,而該文件夾中有一個名為 text_files 的文件夾用于存儲程序文件操作的文本文件。雖然文件夾 text_files 包含在文件夾python_work 中,但僅向 open()傳遞位于前者中的文件名稱也不可行,因為 Python 只在文件夾 python_work中查找,而不會在其子文件夾 text_files 中查找。要讓 Python 打開不與程序文件位于同一個目錄中的文件,需要提供文件路徑,讓Python 到系統(tǒng)的特定位置去查找。
否則會出現(xiàn)如下圖所示:python會告訴你找不到該文件

那么該怎么解決這個問題呢?
這里我們就需要用絕對路徑,例如,我們現(xiàn)在建立一個.txt在桌面。
下面我們使用相對路徑(僅提供文件名的方式),去打開:
with open(r"新建文本文檔.txt",'r',encoding='utf-8') as f:
ff=f.read()
print(ff)
我們發(fā)現(xiàn)文件根本打不開。

現(xiàn)在我們使用絕對路徑(提供具體的位置信息),去打開:
with open(r"C:\Users\Lenovo\Desktop\新建文本文檔.txt",'r',encoding='utf-8') as f:
ff=f.read()
print(ff)
文件內(nèi)容被很好的顯示出來了。

注:encoding='utf-8的作用是為了避免出現(xiàn)亂碼。
上圖所示程序,不加encoding='utf-8,就會出現(xiàn)以下情況;

注:顯示文件路徑時,Windows系統(tǒng)使用反斜杠(\),而不是斜杠(/),但在代碼中仍可以使用斜杠。
如果在文件路徑中直接使用反斜杠,將引發(fā)錯誤,因為反斜杠用于對字符串中的字符進(jìn)行轉(zhuǎn)義。
舉例:
C:\path\to\file.txt
其中的\t會被解讀為制表符,如果一定要使用反斜杠,可對相對路徑中的每個反斜杠都進(jìn)行轉(zhuǎn)義:
C:\\path\\to\\file.txt
逐行讀取
讀取文件時,常常需要檢查其中的每一行:可能要在文件中查找特定的信息,或者要以某種方式修改文件中的文本。
直接使用for循環(huán)的方法:
在該目錄下的文件讀?。?/p>
for line in open("123.txt",encoding='utf-8'):
print(line)
計算機其他位置中的:
for line in open(r"C:\Users\Lenovo\Desktop\新建文本文檔.txt",encoding='utf-8'):
print(line)
使用while循環(huán)
在該目錄下的文件讀取:
f=open("123.txt",encoding='utf-8')
line=f.readline()
while line:
print(line)
line=f.readline()
f.close()
計算機其他位置中的:
f=open(r"C:\Users\Lenovo\Desktop\新建文本文檔.txt",encoding='utf-8')
line=f.readline()
while line:
print(line)
line=f.readline()
f.close()
使用with…as結(jié)構(gòu)
在該目錄下的文件讀?。?/p>
with open("123.txt",encoding='utf-8') as f:
for line in f:
print(line)
計算機其他位置中的:
with open(r"C:\Users\Lenovo\Desktop\新建文本文檔.txt",encoding='utf-8') as f:
for line in f:
print(line)
運行上面兩個文件的結(jié)果:
hi,python
早上好
晚上好
你好
窗前明月光,疑似地上霜
舉頭望明月,低頭思?xì)w鄉(xiāng)
鵝鵝鵝,曲項向天歌
白毛浮綠水,紅掌撥清波
我們不難發(fā)現(xiàn),空白行變得更多了,原因是:在這個文件中,每行末尾都有一個看不見的換行符,而print函數(shù)在調(diào)用的時候也會產(chǎn)生一個換行符,因此每行末尾都會有兩個換行符,一個來自文件,一個來自print函數(shù)的調(diào)用,要想消除這些換行符,可在調(diào)用print函數(shù)的時候,使用rstrip():
print(line.rstrip())
處理之后的結(jié)果:
窗前明月光,疑似地上霜
舉頭望明月,低頭思?xì)w鄉(xiāng)
鵝鵝鵝,曲項向天歌
白毛浮綠水,紅掌撥清波
hi,python
早上好
晚上好
你好
創(chuàng)建一個包含文件各行內(nèi)容的列表
使用關(guān)鍵字 with 時,open()返回的文件對象只在 with 代碼塊內(nèi)可用。如果要在 with 代碼塊外訪問文件的內(nèi)容,可在 with 代碼塊內(nèi)將文件的各行存儲在一個列表中,并在 with 代碼塊外使用該列表:可以立即處理文件的各個部分,也可以推遲到程序后面再處理。
with open("123.txt",encoding='utf-8') as f:
lines=f.readlines()#使用readlines()從文件中讀取每一行,并將其存儲在一個列表中
//這樣處理后,在with代碼塊外仍然可以使用變量lines
for line in lines:
print(line)
輸出結(jié)果:
hi,python
早上好
晚上好
你好
使用文件中的內(nèi)容
舉例:
with open("123.txt",encoding='utf-8') as f:
lines=f.readlines()
pi=str()#創(chuàng)建空的字符串用于存儲文本內(nèi)容
for line in lines:
pi+=line.rstrip()#將每行末尾的空行去掉
print(pi)
print(len(pi))#輸出字符串的長度
1234562345671038417968539
25

注:讀取文本文件的時候,python會自動將所有的文本文件解讀成字符串,如果文本文件中的內(nèi)容為數(shù)值,并且要作為數(shù)值使用,就必須使用int()函數(shù),或者float()函數(shù)將其進(jìn)行轉(zhuǎn)化。
舉例:
如果上述例子中的123.txt中的內(nèi)容要作為數(shù)值使用,則程序應(yīng)進(jìn)行修改:
如下:
with open("123.txt",encoding='utf-8') as f:
lines=f.readlines()
pi=int()#進(jìn)行強制轉(zhuǎn)化
#pi=float()
for line in lines:
pi+=int(line)
#pi+=float(line)
print(pi)
1038418326562
包含千位以上的大型文件
前面我們所分析的都是包含幾行的文本文件,現(xiàn)在假設(shè)我們有一個文件,其中包含精確到小數(shù)點后千位而不是30位的圓周率,也可創(chuàng)建一個字符串將他包含到里面,有的小伙伴想到這個問題會覺得很棘手,程序該怎么寫呢?
其實,我們前面編撰好的程序就可以直接進(jìn)行傳遞使用:
with open("123.txt",encoding='utf-8') as f:
lines=f.readlines()
pi=str()#創(chuàng)建空的字符串用于存儲文本內(nèi)容
for line in lines:
pi+=line.rstrip()#將每行末尾的空行去掉
print(f"{pi[:52]}.....")#為了避免顯示的內(nèi)容不停的滾動,只打印前52位
print(len(pi))#輸出字符串的長度
1234562345671038417968539168519635885951538287826636.....
1596
同理,對于萬位,百萬位等等更大的文件,我們的程序仍然可以使用。
圓周率中包含你的生日嗎
with open("123.txt",encoding='utf-8') as f:
lines=f.readlines()
pi=str()#創(chuàng)建空的字符串用于存儲文本內(nèi)容
for line in lines:
pi+=line.rstrip()#將每行末尾的空行去掉
you_birthday=str(input("請輸入你的生日"))
if you_birthday in pi:
print("yes")
else:
print("NO")
請輸入你的生日0904
yes
寫入文件
1:寫入空文件:
要將文本寫入文件,你在調(diào)用open()時,需要提供另一個參數(shù),告訴python,你要寫入打開的文件.
舉例:
with open("123.txt",'w',encoding='utf-8') as f:
f.write("晚上好")
打開該文件:

#open(名稱,操作模式 )#操作模式包括:w:寫,r:讀取 ,a:附加,r+:讀寫`
如果省略了操作模式,python自動以只讀的方式打開,如果要寫入的文件不存在,python的open()函數(shù)將自動創(chuàng)建它,以寫入的模式(w)打開,如果該文件已存在,則python會自動清空之前的內(nèi)容。
python只能將字符串寫入文本文件文件,要是想將數(shù)據(jù)存儲到文本文件中,需要先用str()將其轉(zhuǎn)化為字符串格式。
寫入多行:
函數(shù)write()不會在寫入的文本末尾添加換行符,因此如果寫入多行時沒有指定換行符,文件看起來可能不是我們想要的那樣:
舉例:
with open("123.txt",'w',encoding='utf-8') as f:
f.write("早上好---good morning")
f.write("中午好---good afternoon")
f.write("晚上好---good evening")
如下圖所示,所有的內(nèi)容都被顯示在一行:

怎么解決這種問題呢?需要在方法調(diào)用write()中包含換行符:
with open("123.txt",'w',encoding='utf-8') as f:
f.write("早上好---good morning\n")
f.write("中午好---good afternoon\n")
f.write("晚上好---good evening\n")
現(xiàn)在文本內(nèi)容呈現(xiàn)在不同行中:

像顯示到終端一樣,還可以使用空格,制表符和空行來設(shè)置這些輸出的格式。
附加到文件
如果要給文件添加內(nèi)容而不是覆蓋原來的內(nèi)容,可以以附加模式打開文件,以附加模式打開文件時,python不會在返回文件對象前清空文件的內(nèi)容,而是將寫入文件的行添加到文件末尾,如果指定的文件不存在,python會為你創(chuàng)建一個空文件。
舉例:
with open("123.txt",'a',encoding='utf-8') as f:#以附加模式打開
f.write("hello,world")#將hello,world寫入文件
原內(nèi)容并沒有被清空。

到此這篇關(guān)于Python常見文件操作的示例詳解的文章就介紹到這了,更多相關(guān)Python文件操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python+Selenium定位不到元素常見原因及解決辦法(報:NoSuchElementException)
這篇文章主要介紹了Python+Selenium定位不到元素常見原因及解決辦法(報:NoSuchElementException),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
python3.7+anaconda 安裝opencv和dlib的問題及解決方法
這篇文章主要介紹了python3.7+anaconda 安裝opencv和dlib的問題及解決方法,本文圖文并茂給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08
Python庫textract提取各種文檔類型中文本數(shù)據(jù)
Python的textract庫是一個強大的工具,它可以從各種文檔類型中提取文本數(shù)據(jù),無論是PDF、Word文檔、圖片還是其他格式的文件,textract都可以輕松地將文本提取出來,本文將詳細(xì)介紹textract的功能和用法,并提供豐富的示例代碼來幫助大家深入了解2024-01-01

