如何用更Pythonic的方式将目录中特定模板文件路径分配给对应变量?
问题描述
我通过以下代码读取目录中所有文件并将其绝对路径存储到列表中:
files = [os.path.abspath(x) for x in os.listdir(r"my directory")]
生成的列表示例如下(文件顺序不固定):
[ "C:\\Users\\....\\Template_Coversheet.xlsx", "C:\\Users\\....\\Template_Blanks.xlsx", "C:\\Users\\....\\Template_Stocks.xlsx", "C:\\Users\\....\\Template_May.xlsx" ]
每个文件对应唯一模板,我希望将这些文件路径分配给与模板类型对应的变量,目前通过for循环加多个if语句实现:
for f in files: if "Blanks" in f: blank=f if "Stocks" in f: stock=f if "May" in f: may=f if "Coversheet" in f: coversheet=f
请问是否有更简便或更Pythonic的实现方式?
更Pythonic的实现方式
方法1:字典映射实现可扩展匹配
先定义关键词与目标变量名的映射关系,遍历文件时自动完成赋值,后续新增模板类型只需修改映射字典,扩展性更强:
import os # 定义关键词到变量名的映射 template_map = { "Blanks": "blank", "Stocks": "stock", "May": "may", "Coversheet": "coversheet" } template_paths = {} for f in files: for keyword, var_name in template_map.items(): if keyword in f: template_paths[var_name] = f break # 每个文件对应唯一模板,匹配成功即跳出内层循环 # 提取变量,也可直接通过template_paths['blank']访问 blank = template_paths["blank"] stock = template_paths["stock"] may = template_paths["may"] coversheet = template_paths["coversheet"]
方法2:生成器表达式直接赋值(简洁版)
如果能确保每个关键词都对应唯一文件,用生成器表达式配合next()直接赋值,代码更紧凑:
blank = next(f for f in files if "Blanks" in f) stock = next(f for f in files if "Stocks" in f) may = next(f for f in files if "May" in f) coversheet = next(f for f in files if "Coversheet" in f)
注意:若存在关键词匹配不到文件的情况,建议给next()添加默认值避免报错,比如next((f for f in files if "Blanks" in f), None)
额外优化:路径读取的严谨写法
原代码中os.listdir()仅返回文件名,若当前工作目录不是目标目录,os.path.abspath()可能生成错误路径。更稳妥的写法是用os.path.join()拼接路径:
target_dir = r"my directory" files = [os.path.abspath(os.path.join(target_dir, x)) for x in os.listdir(target_dir)] # 或使用Python3.4+的pathlib模块,语法更直观 from pathlib import Path files = [str(path.resolve()) for path in Path(target_dir).iterdir()]
内容的提问来源于stack exchange,提问作者Gingerhaze
相关产品推荐
相关产品推荐

