Python文本文件列表匹配异常:数量不足且顺序随机问题咨询
问题原因分析与解决方案
一、匹配数量不足(仅83个,预期183个)的核心原因
- 路径处理完全错误:list2是带完整路径的文件列表,但你的代码用
name.split('.')[0]提取的是包含路径的前缀(比如D://xxx//video1),而list1里是纯文件名(比如video1.mp4),提取的前缀是video1,两者根本匹配不上,这是漏匹配的主要原因。 - 集合自动去重:你把list1和list2都转成了
set,如果原文件里有重复的文件名/路径,会被直接去重,导致原本应该匹配的重复项被过滤,数量大幅减少。 - 文件名分割逻辑缺陷:如果文件名本身包含多个点(比如
video.2024.mp4),split('.')[0]只会取第一个点前的内容(video),而正确的文件名主体应该是video.2024,这也会导致部分匹配失败。
二、结果顺序随机的原因
set是无序容器,把文件内容转成集合后,原文件的行顺序会完全丢失,最后生成的结果自然是随机顺序。
三、修正后的代码
import os # 保留原文件顺序,不再用set # list1:带扩展名的视频文件名列表 list1 = [line.strip() for line in open('D://RTS//marko//lab//python//xml_parse//aveco2venice_playlist//data//export//06-tv1-filelist.txt', 'r', encoding="UTF8")] # list2:带路径的文件列表 list2 = [line.strip() for line in open('D://RTS//marko//lab//python//xml_parse//aveco2venice_playlist//data//export//05-tv1-matpath.txt', 'r', encoding="UTF8")] def get_file_core_name(name): # 先剥离路径取纯文件名,再去掉扩展名 pure_filename = os.path.basename(name) return os.path.splitext(pure_filename)[0] # 把list2的文件名主体存成集合(仅用于快速匹配,不影响原始数据) list2_core_names = {get_file_core_name(path) for path in list2} # 按list1的原顺序筛选匹配项 found_fn = [name for name in list1 if get_file_core_name(name) in list2_core_names] # 按行堆叠写入结果 with open('D://RTS//marko//lab//python//xml_parse//aveco2venice_playlist//data//export//05-tv1-differente.txt', 'w', encoding="UTF8") as output_diff: for item in found_fn: output_diff.write(f"{item}\n")
关键优化点
- 用
os.path.basename和os.path.splitext正确提取文件名主体,彻底避免路径和多文件名点的干扰。 - 保留原文件的行顺序,不再用
set存储原始列表。 - 仅把list2的文件名主体转成集合,保证匹配效率的同时不丢失原始数据。
- 用
with语句管理文件,更安全;写入时按行输出,完全符合“按行堆叠”的需求。
内容的提问来源于stack exchange,提问作者amnesia
相关产品推荐
相关产品推荐

