*** 首先需要說明一點,要想按照指定順序讀取文件,首先就得(重命名)使文件名具有一定的規律。比如將文件名稱全部命名成數字,因為數字可以比較大小,方便排序。
參考鏈接:https://www.cnblogs.com/chester-cs/p/12252358.html
涉及到文件操作,我們有時候會讀取一個文件夾中的所有的文件。這些文件可能是文件名完全混亂的,也可能是完全格式化的(如1.png,2.png...)。下面介紹Python中的幾種按順序(假如有)讀取文件夾中文件的方法。
1. 首先不得不說的是python中的 os.listdir() 方法。 os.listdir() 方法用於返回指定的文件夾包含的文件或文件夾的名字的列表。但是,os.listdir()返回的文件名不一定是順序的,這就要求我們對返回的文件名列表進行排序:
假設我們有一個這樣的文件夾:
我們利用os.listdir()方法寫出如下代碼:
import os path = '/Users/28350/Desktop/Files' path_list = os.listdir(path) print(path_list)
輸出結果如下:
可見返回的文件名列表是一個奇怪的順序。
2. 既然os.listdir(path)返回的是文件名列表,那么列表不是可以排序嗎,我只要用 sort() 方法,給列表中的文件名排個序不就好了?看看效果:
path = '/Users/28350/Desktop/Files' path_list = os.listdir(path) path_list.sort() print(path_list)
輸出結果如下:
可見,大致的順序有了。但是糟糕的是10,11,12排到了2前面,這顯然是因為sort()采取了按字符鍵值排序的手段。那么怎樣解決這個問題呢?我們對代碼稍作改變:
path = '/Users/28350/Desktop/Files' path_list = os.listdir(path) path_list.sort(key=lambda x:int(x[:-4])) print(path_list)
新加入的一行做的作用是將每個文件名將句號 (.) 前的字符串轉化為數字,然后以數字為key來進行排序。這樣便能夠按照我們的心意來排序了。
3. 使用的時候發現了新問題:這個手段要求文件名高度格式化,假如一堆圖片中夾雜了一張其他格式的呢?比如13.jpeg,這樣的話上面的代碼會讀到句號,轉化不成int而報錯。這時候不妨試試下面的方法。
path = '/Users/28350/Desktop/Files' path_list = os.listdir(path) path_list.sort(key=lambda x:int(x.split('.')[0])) print(path_list)
這樣寫的話就只需考慮句號前面的數字順序了,更有普適性。
總結一下:想要按順序讀取文件夾中的文件,方法不是固定的,對於不同的文件名見招拆招才是上策。實在不行咱們還可以動用我們的大殺器:正則表達式,只需要我們有一個善於發現文件名特征的眼睛就難不倒我們啦。