如何提取两个TXT文件中因前缀差异未匹配的缺失相机型号行
相机型号列表差集提取方案
核心逻辑是先对所有型号做标准化处理,消除品牌前缀带来的写法差异,再做集合比对,不要直接用原始文本匹配。
前置准备
先整理你文件中出现过的所有相机品牌前缀,统一为大写形式,常见的参考如下,遇到其他品牌可以自行补充:
- NIKON
- CANON
- SONY
- FUJIFILM
- PANASONIC
- OLYMPUS
- LEICA
- PENTAX
- RICOH
如果存在多词前缀(比如CANON POWERSHOT),直接把完整长前缀加入列表即可,匹配时长前缀放在短前缀前面,避免切分错误。
处理脚本
直接用Python运行即可,不需要安装额外第三方库,把开头的文件路径改成你本地的实际路径:
# 配置项,修改为你的本地文件路径 FILE_A = "camera_list_a.txt" FILE_B = "camera_list_b.txt" OUTPUT_ONLY_A = "only_in_a.txt" OUTPUT_ONLY_B = "only_in_b.txt" # 补充所有你遇到的品牌/固定前缀,长前缀放前面 PREFIX_LIST = ["CANON POWERSHOT", "NIKON", "CANON", "SONY", "FUJIFILM", "PANASONIC", "OLYMPUS", "LEICA", "PENTAX", "RICOH"] def normalize_model(line: str) -> str: """统一型号格式,消除前缀、大小写、多余空格的差异""" text = line.strip().upper() if not text: return "" for prefix in PREFIX_LIST: if text.startswith(prefix): text = text[len(prefix):].strip() break return text def load_model_dict(file_path: str) -> dict: model_map = {} # 如果你的文件是GBK编码,把下面encoding参数改成gbk with open(file_path, "r", encoding="utf-8") as f: for line in f: raw_content = line.rstrip("\n") std_key = normalize_model(raw_content) if std_key: model_map[std_key] = raw_content return model_map if __name__ == "__main__": model_dict_a = load_model_dict(FILE_A) model_dict_b = load_model_dict(FILE_B) key_set_a = set(model_dict_a.keys()) key_set_b = set(model_dict_b.keys()) only_in_a = [model_dict_a[k] for k in key_set_a - key_set_b] only_in_b = [model_dict_b[k] for k in key_set_b - key_set_a] with open(OUTPUT_ONLY_A, "w", encoding="utf-8") as f: f.write("\n".join(only_in_a)) with open(OUTPUT_ONLY_B, "w", encoding="utf-8") as f: f.write("\n".join(only_in_b)) print(f"处理完成:仅在A文件存在的型号共{len(only_in_a)}条,仅在B文件存在的共{len(only_in_b)}条")
匹配效果说明
你提到的几种写法经过标准化后会被识别为同一型号,不会被误判为差异项:
- 原始值
NIKON D610、D610→ 标准化key均为D610 - 原始值
CANON POWERSHOT A1200、POWERSHOT A1200→ 标准化key均为POWERSHOT A1200
如果后续遇到其他写法差异(比如多余的KIT套机后缀、版本号后缀),直接在normalize_model函数里增加对应的字符串裁剪逻辑即可。
内容的提问来源于stack exchange,提问作者NBG
相关产品推荐
相关产品推荐

