在這個(gè)世界上,人們每天都在用 Python 完成著不同的工作。而文件操作,則是大家最常需要解決的任務(wù)之一。使用 Python,你可以輕松為他人生成精美的報(bào)表,也可以用短短幾行代碼快速解析、整理上萬份數(shù)據(jù)文件。

當(dāng)我們編寫與文件相關(guān)的代碼時(shí),通常會(huì)關(guān)注這些事情: 我的代碼是不是足夠快?我的代碼有沒有事半功倍的完成任務(wù)? 在這篇文章中,我會(huì)與你分享與之相關(guān)的幾個(gè)編程建議。我會(huì)向你推薦一個(gè)被低估的 Python 標(biāo)準(zhǔn)庫模塊、演示一個(gè)讀取大文件的最佳方式、最后再分享我對函數(shù)設(shè)計(jì)的一點(diǎn)思考。

下面,讓我們進(jìn)入第一個(gè)“模塊安利”時(shí)間吧。

注意: 因?yàn)椴煌僮飨到y(tǒng)的文件系統(tǒng)大不相同,本文的主要編寫環(huán)境為 Mac OS/Linux 系統(tǒng),其中一些代碼可能并不適用于 Windows 系統(tǒng)。

建議一:使用 pathlib 模塊

如果你需要在 Python 里進(jìn)行文件處理,那么標(biāo)準(zhǔn)庫中的 os os.path 兄弟倆一定是你無法避開的兩個(gè)模塊。在這兩個(gè)模塊里,有著非常多與文件路徑處理、文件讀寫、文件狀態(tài)查看相關(guān)的工具函數(shù)。

讓我用一個(gè)例子來展示一下它們的使用場景。有一個(gè)目錄里裝了很多數(shù)據(jù)文件,但是它們的后綴名并不統(tǒng)一,既有 .txt ,又有 .csv 。我們需要把其中以 .txt 結(jié)尾的文件都修改為 .csv 后綴名。

我們可以寫出這樣一個(gè)函數(shù):

            
              在學(xué)習(xí)過程中有什么不懂得可以加我的
python學(xué)習(xí)交流扣扣qun,784758214
群里有不錯(cuò)的學(xué)習(xí)視頻教程、開發(fā)工具與電子書籍。
與你分享python企業(yè)當(dāng)下人才需求及怎么從零基礎(chǔ)學(xué)習(xí)好python,和學(xué)習(xí)什么內(nèi)容

1.  `import os`

2.  `import os.path`

5.  `def unify_ext_with_os_path(path):`

6.  `"""統(tǒng)一目錄下的 .txt 文件名后綴為 .csv`

7.  `"""`

8.  `for filename in os.listdir(path):`

9.  `basename, ext = os.path.splitext(filename)`

10.  `if ext ==  '.txt':`

11.  `abs_filepath = os.path.join(path, filename)`

12.  `os.rename(abs_filepath, os.path.join(path, f'{basename}.csv'))`

            
          

讓我們看看,上面的代碼一共用到了哪些與文件處理相關(guān)的函數(shù):

  • os.listdir(path) :列出 path 目錄下的所有文件(含文件夾)

  • os.path.splitext(filename) :切分文件名里面的基礎(chǔ)名稱和后綴部分

  • os.path.join(path,filename) :組合需要操作的文件名為絕對路徑

  • os.rename(...) :重命名某個(gè)文件

上面的函數(shù)雖然可以完成需求,但說句實(shí)話,即使在寫了很多年 Python 代碼后,我依然覺得: 這些函數(shù)不光很難記,而且最終的成品代碼也不怎么討人喜歡。

使用 pathlib 模塊改寫代碼

為了讓文件處理變得更簡單,Python 在 3.4 版本引入了一個(gè)新的標(biāo)準(zhǔn)庫模塊:pathlib。它基于面向?qū)ο笏枷朐O(shè)計(jì),封裝了非常多與文件操作相關(guān)的功能。如果使用它來改寫上面的代碼,結(jié)果會(huì)大不相同。

使用 pathlib 模塊后的代碼:

            
              1.  `from pathlib import  Path`

3.  `def unify_ext_with_pathlib(path):`

4.  `for fpath in  Path(path).glob('*.txt'):`

5.  `fpath.rename(fpath.with_suffix('.csv'))`

            
          

和舊代碼相比,新函數(shù)只需要兩行代碼就完成了工作。而這兩行代碼主要做了這么幾件事:

  1. 首先使用 Path(path) 將字符串路徑轉(zhuǎn)換為 Path 對象

  2. 調(diào)用 .glob('*.txt') 對路徑下所有內(nèi)容進(jìn)行模式匹配并以生成器方式返回,結(jié)果仍然是 Path 對象,所以我們可以接著做后面的操作

  3. 使用 .with_suffix('.csv') 直接獲取使用新后綴名的文件全路徑

  4. 調(diào)用 .rename(target) 完成重命名

相比 os os.path ,引入 pathlib 模塊后的代碼明顯更精簡,也更有整體統(tǒng)一感。所有文件相關(guān)的操作都是一站式完成。

其他用法

除此之外,pathlib 模塊還提供了很多有趣的用法。比如使用 / 運(yùn)算符來組合文件路徑:

            
              
1.  `#