參考資料:
https://blog.csdn.net/qq_22227123/article/details/79903116
https://blog.csdn.net/merdy_xi/article/details/78409632
涉及到文件操作,我們有時候會讀取一個文件夾中的所有的文件。這些文件可能是文件名完全混亂的,也可能是完全格式化的(如1.png,2.png...)。下面介紹Python中的幾種按順序(假如有)讀取文件夾中文件的方法。
首先不得不說的是python中的os.listdir()方法。 os.listdir() 方法用於返回指定的文件夾包含的文件或文件夾的名字的列表。功能是不是一目了然?
但是,os.listdir()返回的文件名不一定是順序的,這就要求我們對返回的文件名列表進行排序:
假設我們有一個這樣的文件夾:
我們利用os.listdir()方法寫出如下代碼:
import os
path = '/Users/apple/Desktop/OCR'
path_list = os.listdir(path)
path_list.remove('.DS_Store') # macos中的文件管理文件,默認隱藏,這里可以忽略
print(path_list)
輸出結果如下:

可見返回的文件名列表是一個奇怪的順序。
OK,既然os.listdir(path)返回的是文件名列表,那么列表不是可以排序嗎,我只要用sort()方法,給列表中的文件名排個序不就好了?看看效果:
path = '/Users/apple/Desktop/OCR'
path_list = os.listdir(path)
path_list.remove('.DS_Store') # 同上
path_list.sort()
print(path_list)
輸出結果如下: 
可見,大致的順序有了。但是糟糕的是10,11,12排到了2前面,這顯然是因為sort()采取了按字符鍵值排序的手段。
那么怎樣解決這個問題呢?我們對代碼稍作改變:
path = '/Users/apple/Desktop/OCR'
path_list = os.listdir(path)
path_list.remove('.DS_Store')
path_list.sort(key=lambda x:int(x[:-4]))
print(path_list)
新加入的一行做的事情是--對每個文件名將句號前的字符串轉化為數字,然后以數字為key來進行排序。這樣便能夠按照我們的心意來排序了。動手試試看看~~
使用的時候發現了新問題:這個手段要求文件名高度格式化,假如一堆圖片中夾雜了一張其他格式的呢?比如13.jpeg,這樣的話上面的代碼會讀到句號,轉化不成int而報錯。這時候不妨試試下面的方法。
path = '/Users/apple/Desktop/OCR'
path_list = os.listdir(path)
path_list.remove('.DS_Store')
path_list.sort(key=lambda x:int(x.split('.')[0]))
print(path_list)
這樣寫的話就只需考慮句號前面的數字順序了,更有普適性。
水到渠成,讀取文件:
for filename in path_list:
f = open(os.path.join(path,filename),'rb')
總結一下:想要按順序讀取文件夾中的文件,方法不是固定的,對於不同的文件名見招拆招才是上策。實在不行咱們還可以動用我們的大殺器:正則表達式,只需要我們有一個善於發現文件名特征的眼睛就難不倒我們啦。
