Python文件的读写操作
使用Python編程時(shí),經(jīng)常會(huì)遇到讀寫文件的操作。對于讀寫文件的各種模式(如閱讀、寫入、追加等)有時(shí)真的會(huì)迷惑人,以及搞不清open、read、readline、readlines、write、writelines等方法的使用也會(huì)把你繞的云里霧里。
期望這篇文章能夠幫你更好的了解應(yīng)該如何讀寫文件,并在最恰當(dāng)?shù)牡胤接米詈线m的方法。
什么是文件?
在我們開始研究如何使用Python中的文件之前,了解文件究竟是什么以及現(xiàn)代操作系統(tǒng)如何處理它們的某些方面是非常重要的。
從本質(zhì)上講,文件是用于存儲(chǔ)數(shù)據(jù)的連續(xù)字節(jié)集。這些數(shù)據(jù)以特定格式組織,可以是任何像文本文件一樣簡單的數(shù)據(jù),也可以像程序可執(zhí)行文件一樣復(fù)雜。最后,這些字節(jié)文件被翻譯成二進(jìn)制文件1,0以便計(jì)算機(jī)更容易處理。
大多數(shù)現(xiàn)代文件系統(tǒng)上的文件由三個(gè)主要部分組成:
-
標(biāo)題(Header):有關(guān)文件內(nèi)容的元數(shù)據(jù)(文件名,大小,類型等)
-
數(shù)據(jù)(Data):由創(chuàng)建者或編輯者編寫的文件內(nèi)容
-
文件結(jié)束(EOF):表示文件結(jié)尾的特殊字符
數(shù)據(jù)表示的內(nèi)容取決于所使用的格式規(guī)范,通常由擴(kuò)展名表示。例如,擴(kuò)展名為.gif的文件最可能符合圖形交換格式規(guī)范。有數(shù)百個(gè)(如果不是數(shù)千個(gè))文件擴(kuò)展名。
文件路徑
在操作系統(tǒng)上訪問文件時(shí),需要文件路徑。文件路徑是表示文件位置的字符串。它分為三個(gè)主要部分:
-
文件夾路徑:文件系統(tǒng)上的文件夾位置,后續(xù)文件夾由正斜杠/(Unix)或反斜杠\(Windows)分隔
-
文件名:文件的實(shí)際名稱
-
擴(kuò)展名:文件路徑的末尾預(yù)先設(shè)置了句號(.),用于表示文件類型
Python文件路徑相關(guān)操作:
-
使用getcwd()可獲得當(dāng)前工作目錄,即當(dāng)前Python腳本工作的目錄路徑,類似Linux中pwd命令
-
如果想打印Windows中包含中文的文件名或路徑,需要使用“GBK”進(jìn)行decode
-
-
合并路徑使用path.join()
-
Windows中的反斜杠與Linux中的正斜杠使用sep(反斜杠需要使用\\轉(zhuǎn)義)
-
-
相對路徑
-
(.)點(diǎn)表示當(dāng)前文件夾
-
(.. )點(diǎn)點(diǎn)表示父文件夾
-
-
相對路徑、絕對路徑轉(zhuǎn)換
-
path.abspath(path):返回絕對路徑
-
path.isabs(path):判斷是否是絕對路徑
-
path.relpath(path,start):返回相對路徑
-
-
路徑分割:
-
path.dirname(path):返回文件所在目錄,os.path.basename(path):返回文件名
-
path.split(path) == (os.path.dirname(path), os.path.basename(path)).silit(os.sep)是將路徑按分隔符分割
-
path.basename():獲取文件名
-
path.splitext():分離擴(kuò)展名
-
查看文件大小:path.getsize(filename),只能統(tǒng)計(jì)文件,不同統(tǒng)計(jì)文件夾,如需統(tǒng)計(jì)文件夾需要自行遍歷。
-
獲取文件屬性:stat(file)
-
檢查路徑有效性
-
path.exists:路徑是否存在
-
path.isdir:是否為目錄
-
path.isfile:是否是文件
-
-
返回指定目錄下的所有文件和目錄名:listdir()
其他方法:
-
刪除文件:os.remove()
-
刪除目錄:removedirs(r”c:\python “)
-
重命名:rename(old, new) #文件或目錄都是使用這條命令
-
創(chuàng)建多級目錄:makedirs(r”c:\python\test”),其會(huì)創(chuàng)建中間文件夾,類似Linux命令 mkdir -p
-
創(chuàng)建單個(gè)目錄:mkdir(“test”)
-
修改文件權(quán)限與時(shí)間戳:chmod(file)
目錄操作:
-
復(fù)制文件:
-
copyfile(“oldfile”, “newfile”) #oldfile和newfile都只能是文件
-
copy(“oldfile”, “newfile”) #oldfile只能是文件夾,newfile可以是文件,也可以是目標(biāo)目錄
-
-
復(fù)制文件夾:copytree(“olddir”, “newdir”) #olddir和newdir都只能是目錄,且newdir必須不存在
-
移動(dòng)文件(目錄):move(“oldpos”,”newpos”)
-
刪除目錄
-
rmdir(“dir”) #只能刪除空目錄
-
rmtree(“dir”) #空目錄、有內(nèi)容的目錄都可以刪
-
行結(jié)尾
處理文件數(shù)據(jù)時(shí)經(jīng)常遇到的一個(gè)問題是新行或行結(jié)尾的表示。行結(jié)尾起源于莫爾斯電碼時(shí)代,使用一個(gè)特定的符號被用來表示傳輸?shù)慕Y(jié)束或一行的結(jié)尾。
后來,國際標(biāo)準(zhǔn)化組織(ISO)和美國標(biāo)準(zhǔn)協(xié)會(huì)(ASA)對電傳打字機(jī)進(jìn)行了標(biāo)準(zhǔn)化。ASA標(biāo)準(zhǔn)規(guī)定行尾應(yīng)使用回車(序列CR或\r)和換行(LF或\n)字符(CR+LF或\r\n)。然而,ISO標(biāo)準(zhǔn)允許CR+LF字符或僅LF字符。
Windows使用CR+LF字符表示新行,而Unix和較新的Mac版本僅使用LF字符。當(dāng)你處理來源于不同操作系統(tǒng)上的文件時(shí),這可能會(huì)導(dǎo)致一些復(fù)雜情況。這是一個(gè)簡單的例子。假設(shè)我們檢查在Windows系統(tǒng)上創(chuàng)建的文件dog_breeds.txt:
同樣的輸出將在Unix設(shè)備上以不同方式解釋:
解決方案:
Python遍歷文件夾方法
使用walk()
輸出總是先文件夾后文件名
使用listdir
按照目錄樹結(jié)構(gòu)以及按照首字母排序進(jìn)行輸出的。
glob模塊
glob模塊是最簡單的模塊之一,內(nèi)容非常少。用它可以查找符合特定規(guī)則的文件路徑名。
glob.glob
返回所有匹配的文件路徑列表。它只有一個(gè)參數(shù)pathname,定義了文件路徑匹配規(guī)則,這里可以是絕對路徑,也可以是相對路徑。示例:
glob.iglob
獲取一個(gè)可編歷對象,使用它可以逐個(gè)獲取匹配的文件路徑名。與glob.glob()的區(qū)別是:glob.glob同時(shí)獲取所有的匹配路徑,而 glob.iglob一次只獲取一個(gè)匹配路徑,即生成器。
Python讀寫文件內(nèi)容
使用with語句打開文件
在Python中讀寫文件需要3個(gè)步驟:
-
調(diào)用open函數(shù),返回一個(gè)File對象
-
調(diào)用File對象的read()或write()方法
-
調(diào)用File對象的close() 方法,關(guān)閉該文件
文件常用打開模式:
-
‘r’:只讀(缺省。如果文件不存在,則拋出錯(cuò)誤)
-
‘w’:只寫(如果文件不存在,則自動(dòng)創(chuàng)建文件)
-
‘a(chǎn)’:附加到文件末尾
-
‘r+’:讀寫
如果需要以二進(jìn)制方式打開文件,需要在mode后面加上字符”b”,比如”rb””wb”等
如果不用with語句,代碼如下:
這里有兩個(gè)問題:
-
可能忘記關(guān)閉文件句柄;
-
文件讀取數(shù)據(jù)發(fā)生異常,沒有進(jìn)行任何處理。
加強(qiáng)版代碼:
雖然這段代碼運(yùn)行良好,但是太冗長了。with除了有更優(yōu)雅的語法,還可以很好的處理上下文環(huán)境產(chǎn)生的異常。
with版本的代碼:
with的工作流程:
-
緊跟with后面的語句被求值后,返回對象的 __enter__() 方法被調(diào)用,這個(gè)方法的返回值將被賦值給as后面的變量。
-
當(dāng)with后面的代碼塊全部被執(zhí)行完之后,將調(diào)用前面返回對象的 __exit__()方法。
有時(shí)你可能想要讀取文件并同時(shí)寫入另一個(gè)文件。如果你使用在學(xué)習(xí)如何寫入文件時(shí)顯示的示例,它實(shí)際上可以合并到以下內(nèi)容中:
文本讀取:read()、readline()、readlines()的區(qū)別
read()
read()是最簡單的一種方法,一次性讀取文件的所有內(nèi)容放在一個(gè)大字符串中,即存在內(nèi)存中。
read()的優(yōu)點(diǎn):
-
方便、簡單
-
一次性獨(dú)讀出文件放在一個(gè)大字符串中,速度最快
read()的缺點(diǎn):
-
文件過大的時(shí)候,占用內(nèi)存會(huì)過大
readline()
readline()是逐行讀取文本,結(jié)果是一個(gè)list
readline()的優(yōu)點(diǎn):
-
占用內(nèi)存小,逐行讀取
readline()的缺點(diǎn):
-
由于是逐行讀取,速度比較慢
readlines()
readlines()一次性讀取文本的所有內(nèi)容,結(jié)果是一個(gè)list
這種方法讀取的文本內(nèi)容,每行文本末尾都會(huì)帶一個(gè)’\n’換行符 (可以使用L.rstrip(‘\n’)去掉換行符)
readlines()的優(yōu)點(diǎn):
-
一次性讀取文本內(nèi)容,速度比較快
readlines()的缺點(diǎn):
-
隨著文本的增大,占用內(nèi)存會(huì)越來越多
文本寫入:write()與writelines()
-
write()傳入的是字符串
-
writelines()傳入的數(shù)一個(gè)數(shù)組
不要重復(fù)造輪子
在處理文件時(shí)可能會(huì)遇到常見情況。大多數(shù)情況可以使用其他模塊處理。此外,還有內(nèi)置庫,可以使用它們來幫助你:
-
wave:讀寫WAV文件(音頻)
-
aifc:讀寫AIFF和AIFC文件(音頻)
-
sunau:讀取和寫入Sun AU文件
-
tarfile:讀取和寫入tar歸檔文件
-
zipfile:使用ZIP存檔
-
configparser:輕松創(chuàng)建和解析配置文件
-
msilib:讀取和寫入Microsoft Installer文件
-
plistlib:生成并解析Mac OS X .plist文件
還有更多的東西。此外,PyPI還有更多第三方工具可用。以下是一些流行的包:
-
PyPDF2:一個(gè)可以分割,合并和轉(zhuǎn)換 PDF 頁面的庫。
-
Pillow:圖像閱讀和操作
-
python-docx:讀取,查詢以及修改 Microsoft Word 2007+ docx 文件
-
python-pptx:讀取,查詢以及修改 Microsoft PowerPoint 2007+ pptx 文件
-
unp:一個(gè)用來方便解包歸檔文件的命令行工具
參考鏈接:
-
Reading and Writing Files in Python (Guide)
總結(jié)
以上是生活随笔為你收集整理的Python文件的读写操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于c语言的linux嵌入式开发入门
- 下一篇: 一个简单的用Python写抽奖程序