Python批量处理Markdown文件时如何移除文件名前缀的5位数字和下划线
解决方案
方法1:固定长度切片(推荐,性能最优)
因为你的前缀是固定格式:5位数字+1个下划线,总长度为6,直接对文件名切片即可,搭配os.path系列函数处理路径,避免直接替换路径字符串引发的异常。
需要修改的核心逻辑:
# 拆分原始文件的路径和文件名 dir_path, original_filename = os.path.split(x) # 切掉前6位的前缀,长度不足6的文件名保留原名避免报错 new_filename = original_filename[6:] if len(original_filename) >6 else original_filename # 替换input目录为output目录 output_dir = dir_path.replace('input', 'output') # 拼接得到完整的输出文件路径 y = os.path.join(output_dir, new_filename)
把原来代码里的y = x.replace('input', 'output')替换成上面这段逻辑即可。
方法2:正则匹配(兼容性更强)
如果担心存在不符合前缀规则的文件,不想误切正常文件名,可以用正则匹配前缀,只有命中5位数字+下划线开头的规则才切除:
首先导入re模块:
import re
然后处理文件名的逻辑替换为:
dir_path, original_filename = os.path.split(x) # 匹配开头的5位数字+下划线,匹配到就替换为空 new_filename = re.sub(r'^\d{5}_', '', original_filename) output_dir = dir_path.replace('input', 'output') y = os.path.join(output_dir, new_filename)
修改后的完整代码(切片版)
import glob import os import markdown def main(): input_root = r"\\servername\prod_help_file\input" output_root = r"\\servername\prod_help_file\output" big_file_path = r"\\servername\prod_help_file\bigfile.md" file_list_md = glob.glob(os.path.join(input_root, "*.md")) file_list_html = glob.glob(os.path.join(input_root, "*.html")) config = { 'extra': { 'footnotes': { 'UNIQUE_IDS': True } } } with open(big_file_path, 'w', encoding='utf-8') as output: for x in file_list_md: with open(x, 'r', encoding='utf-8') as body: text = body.read() html = markdown.markdown(text, extensions=['extra'], extension_configs=config) output.write(html) # 处理文件名前缀逻辑 dir_path, original_filename = os.path.split(x) new_filename = original_filename[6:] if len(original_filename) >6 else original_filename # 生成输出路径 new_file_path = os.path.join(output_root, new_filename) k = new_file_path.replace('.md', '.html') with open(k, 'w', encoding='utf-8') as output2: with open(file_list_html[0], 'r', encoding='utf-8') as head: head_text = head.read() output2.write(head_text) output2.write(html) with open(file_list_html[1], 'r', encoding='utf-8') as foot: foot_text = foot.read() output2.write(foot_text) if __name__ == "__main__": main()
补充说明:代码里新增了encoding='utf-8'参数,避免不同系统环境下读写中文或特殊字符出现乱码。
内容的提问来源于stack exchange,提问作者cody valvo
相关产品推荐
相关产品推荐

