Python中如何按相同顺序读取两个文件夹内的对应文件?
问题原因
os.listdir()返回的文件顺序不固定,由操作系统的文件系统决定,即使两个文件夹里的文件名完全一致,读取时也可能因为系统排序逻辑(比如文件创建时间、存储位置)导致顺序不同。- 你当前的代码直接用
os.listdir()的结果生成文件路径,没有做统一排序,所以两个文件夹的文件顺序会不一致。
解决方法
核心是基于文件名对文件列表进行统一排序,同时尽量避免切换工作目录(os.chdir()),减少潜在问题。具体步骤:
- 不切换目录,直接拼接完整文件路径,避免当前工作目录被修改。
- 提取每个文件的纯文件名(比如从
F:/.../asmr_1.txt中取出asmr_1.txt),以此为依据排序。 - 对两个文件夹的文件列表都执行相同的排序逻辑,就能保证顺序一致。
修正后的完整代码
import os from pathlib import Path import glob def reading_file_to_array(sub_dir_name, current_path): # 直接拼接完整文件夹路径,不用切换目录 dir_path = os.path.join(current_path, sub_dir_name) # 获取所有txt文件的完整路径 files_path = [os.path.join(dir_path, x) for x in os.listdir(dir_path) if x.endswith(".txt")] # 基于纯文件名排序,确保顺序统一 files_path.sort(key=lambda x: os.path.basename(x)) # 这里写你原本的文件读取处理逻辑,示例如下(替换成你的实际逻辑) psnr_1080p = [] psnr_720p = [] psnr_480p = [] psnr_360p = [] psnr_160p = [] for file in files_path: with open(file, 'r') as f: # 假设每行对应一个分辨率的数据,根据你的实际需求调整 lines = f.readlines() psnr_1080p.append(lines[0].strip()) psnr_720p.append(lines[1].strip()) psnr_480p.append(lines[2].strip()) psnr_360p.append(lines[3].strip()) psnr_160p.append(lines[4].strip()) return psnr_1080p, psnr_720p, psnr_480p, psnr_360p, psnr_160p current_path = 'F:/RD_data_from_twitch_system/RD_data_from_twitch_system' all_sub_dir_paths = glob(str(current_path) + '/*/') all_sub_dir_names = [Path(sub_dir).name for sub_dir in all_sub_dir_paths] bitrate_data = None psnr_data = None for sub_dir in all_sub_dir_names: if sub_dir == 'bitrate': bitrate_data = reading_file_to_array(sub_dir, current_path) elif sub_dir == 'psnr': psnr_data = reading_file_to_array(sub_dir, current_path) # 提取对应数据,此时bitrate和psnr的文件顺序完全一一对应 bitrate_1080p, bitrate_720p, bitrate_480p, bitrate_360p, bitrate_160p = bitrate_data psnr_1080p, psnr_720p, psnr_480p, psnr_360p, psnr_160p = psnr_data
关键改动说明
- 移除了
os.chdir(),改用os.path.join()直接拼接路径,避免切换目录引发的潜在问题。 - 新增
files_path.sort(key=lambda x: os.path.basename(x)),按纯文件名排序,确保两个文件夹的文件顺序完全匹配。 - 优化了主程序的变量赋值逻辑,代码更简洁清晰。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

