Python实现指定行内容修改并另存新文件的技术问题
问题分析与解决思路
咱们先拆解下你遇到的两个核心问题的根源:
1. 新文件只保存目标行?
这是因为你的代码只在找到包含file=的行时才写入新文件,完全忽略了其他行!遍历文件时,每一行都需要处理(要么修改后写,要么直接写),否则非目标行就会丢失。
2. 误修改了整个文件的点间文本?
这里有两个小问题:
- 你用
'file=' in line判断目标行,会匹配所有包含file=的行(比如行中间出现file=的注释行),而不是需求里要求的以file=开头的行,导致误处理。 - 正则
\..*?\.会匹配行内所有符合“点+任意内容+点”的片段,哪怕这些片段不在file=对应的文件名里(比如行内注释里的点),造成不必要的修改。
修正后的解决方案
下面是针对性修改的代码,同时解决两个问题:
import re file_in = 'tex_file_01.txt' file_out = 'tex_file_01_new.txt' def fix_filename(match): # 专门处理引号内的文件名部分 filename = match.group(1) # 把"点+任意内容+点"替换成单个点,惰性匹配避免跨多个点 fixed_filename = re.sub(r'\..*?\.', '.', filename) return f'file="{fixed_filename}"' # 同时打开输入输出文件,遍历每一行 with open(file_in, 'r') as f_in, open(file_out, 'w') as f_out: for line in f_in: # 精准匹配:只处理以file=开头的行(忽略行首可能的空格) if line.strip().startswith('file='): # 只修改file="..."这个部分,不影响行内其他内容 fixed_line = re.sub(r'file="(.*?)"', fix_filename, line) f_out.write(fixed_line) else: # 非目标行直接原封不动写入 f_out.write(line)
可选优化:只保留主文件名和最后后缀
如果你的需求是把类似a.b.c.jpg的文件名直接改成a.jpg(只保留第一个点前的主名和最后一个点后的后缀),可以把fix_filename函数改成这样:
def fix_filename(match): filename = match.group(1) # 匹配"主名.任意内容.后缀"的结构,替换成"主名.后缀" fixed_filename = re.sub(r'^([^.]+)\..*\.([^.]+)$', r'\1.\2', filename) # 处理只有一个点的情况(比如image.jpg,不修改) if '.' not in fixed_filename and '.' in filename: fixed_filename = filename return f'file="{fixed_filename}"'
验证示例
输入行:
file="image.&!145.jpg" this is a normal line with .dots. file="a.b.c.jpg"
处理后输出:
file="image.jpg" this is a normal line with .dots. file="a.jpg"
内容的提问来源于stack exchange,提问作者tsetso
相关产品推荐
相关产品推荐

