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

當我們編寫與文件相關的代碼時,通常會關注這些事情: 我的代碼是不是足夠快?我的代碼有沒有事半功倍的完成任務? 在這篇文章中,我會與你分享與之相關的幾個編程建議。我會向你推薦一個被低估的 Python 標準庫模塊、演示一個讀取大文件的最佳方式、最后再分享我對函數設計的一點思考。

下面,讓我們進入第一個“模塊安利”時間吧。

注意: 因為不同操作系統的文件系統大不相同,本文的主要編寫環境為 Mac OS/Linux 系統,其中一些代碼可能并不適用于 Windows 系統。

建議一:使用 pathlib 模塊

如果你需要在 Python 里進行文件處理,那么標準庫中的 os os.path 兄弟倆一定是你無法避開的兩個模塊。在這兩個模塊里,有著非常多與文件路徑處理、文件讀寫、文件狀態查看相關的工具函數。

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

我們可以寫出這樣一個函數:

            
              在學習過程中有什么不懂得可以加我的
python學習交流扣扣qun,784758214
群里有不錯的學習視頻教程、開發工具與電子書籍。
與你分享python企業當下人才需求及怎么從零基礎學習好python,和學習什么內容

1.  `import os`

2.  `import os.path`

5.  `def unify_ext_with_os_path(path):`

6.  `"""統一目錄下的 .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'))`

            
          

讓我們看看,上面的代碼一共用到了哪些與文件處理相關的函數:

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

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

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

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

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

使用 pathlib 模塊改寫代碼

為了讓文件處理變得更簡單,Python 在 3.4 版本引入了一個新的標準庫模塊:pathlib。它基于面向對象思想設計,封裝了非常多與文件操作相關的功能。如果使用它來改寫上面的代碼,結果會大不相同。

使用 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'))`

            
          

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

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

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

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

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

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

其他用法

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

            
              
1.  `#