如何按文件夹原始顺序读取图片?Python读取顺序混乱问题求解
按文件夹原始顺序读取图片的解决方法
glob.glob() 返回的文件顺序由操作系统文件系统决定,比如Windows下默认是字符串字典序排序,这和资源管理器里的自然排序(如数字文件名按数值排序)或文件创建顺序不一致,导致读取顺序混乱。以下是几种针对性的解决方案:
方案1:自然排序(匹配资源管理器名称顺序)
如果你的图片文件名包含数字,资源管理器会按数值大小排序,而glob默认按字符串排序,这时候可以用natsort库实现自然排序,和资源管理器显示顺序一致。
- 先安装依赖:
pip install natsort
- 修改后的代码:
import os import glob from natsort import natsorted def read_img(path): global img_array_input, size img_array_input = [] # 匹配所有jpg/JPG格式文件,并进行自然排序 img_paths = natsorted(glob.glob(os.path.join(path, "*.[jJ][pP][gG]"))) for filename in img_paths: img_array_input.append(filename) print("image array append : ", filename) size = len(img_array_input) for i in img_array_input: print("detection ") detection(i) print("detection out")
方案2:按文件创建时间排序(Windows专属)
如果要严格按照文件被添加到文件夹的原始顺序(创建时间)读取,可以调用Windows API获取创建时间并排序:
import os import glob import win32file import win32con def get_creation_time(filepath): # 获取文件的创建时间 handle = win32file.CreateFile( filepath, win32con.GENERIC_READ, win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE, None, win32con.OPEN_EXISTING, win32con.FILE_ATTRIBUTE_NORMAL, None ) create_time = win32file.GetFileTime(handle)[0] win32file.CloseHandle(handle) return create_time def read_img(path): global img_array_input, size img_array_input = [] img_paths = glob.glob(os.path.join(path, "*.[jJ][pP][gG]")) # 按创建时间排序,保持文件原始添加顺序 img_paths.sort(key=lambda x: get_creation_time(x)) for filename in img_paths: img_array_input.append(filename) print("image array append : ", filename) size = len(img_array_input) for i in img_array_input: print("detection ") detection(i) print("detection out")
方案3:跨平台按修改时间排序
如果需要跨平台兼容,且可接受按文件修改时间排序(通常和创建时间接近):
import os import glob def read_img(path): global img_array_input, size img_array_input = [] img_paths = glob.glob(os.path.join(path, "*.[jJ][pP][gG]")) # 按文件修改时间排序 img_paths.sort(key=lambda x: os.path.getmtime(x)) for filename in img_paths: img_array_input.append(filename) print("image array append : ", filename) size = len(img_array_input) for i in img_array_input: print("detection ") detection(i) print("detection out")
内容的提问来源于stack exchange,提问作者melissa
相关产品推荐
相关产品推荐

