You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:03:33