如何按文件夹原始顺序读取所有TXT文件内容存入Python数组
问题原因
glob.iglob的返回顺序由操作系统文件系统的底层遍历逻辑决定,和你在文件资源管理器中看到的顺序没有关联。尤其你的文件名包含多段数字时,默认字符串排序会出现Animation1000_10_1.txt排在Animation1000_2_0.txt前面的问题,这就是你读取内容顺序错乱的核心原因。
实现按指定顺序读取的方案
场景1:按文件资源管理器中「名称排序」的顺序读取(最常用)
这种需求需要对文件名做自然排序,保证文件名内的数字按数值大小排序而非字符串字典序排序,有两种实现方式:
- 方式1:使用第三方库
natsort(操作简单,适配所有带数字的文件名格式)- 先安装依赖:
pip install natsort - 调整后代码:
import glob import numpy as np from natsort import natsorted # 1. 收集所有txt文件路径 file_paths = glob.glob(r'E:/PSNR_RDCURVE/*.txt') # 2. 对路径做自然排序,和资源管理器名称排序结果一致 sorted_file_paths = natsorted(file_paths) # 3. 按排序后的路径读取内容 psnr_bitrate = np.vstack([np.loadtxt(path, dtype='float') for path in sorted_file_paths]) - 先安装依赖:
- 方式2:自定义排序规则(无需安装第三方库,适配你当前的文件名格式)
直接提取文件名中的所有数字段作为排序依据,代码如下:import glob import re import numpy as np file_paths = glob.glob(r'E:/PSNR_RDCURVE/*.txt') # 自定义排序key:提取文件名中所有数字转为元组做排序依据 def get_sort_key(file_path): file_name = file_path.split('/')[-1] num_list = re.findall(r'\d+', file_name) return tuple(map(int, num_list)) sorted_file_paths = sorted(file_paths, key=get_sort_key) psnr_bitrate = np.vstack([np.loadtxt(path, dtype='float') for path in sorted_file_paths])
场景2:按文件创建/修改时间顺序读取
如果你的「原始顺序」指的是文件生成的先后顺序,直接修改排序的key即可:
import glob import os import numpy as np file_paths = glob.glob(r'E:/PSNR_RDCURVE/*.txt') # 按文件创建时间排序(Windows下生效,Linux下getctime返回元数据修改时间) sorted_file_paths = sorted(file_paths, key=lambda x: os.path.getctime(x)) # 如需按修改时间排序,把getctime换成getmtime即可 psnr_bitrate = np.vstack([np.loadtxt(path, dtype='float') for path in sorted_file_paths])
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

