修改TXT文件数值时结果不符预期的技术求助
问题排查与解决方案
问题原因
- 正则匹配失效:你使用的
^1、^2等正则是匹配行首直接为对应数字的行,但原文件中每行数字前有空格,导致这些正则无法匹配到目标数字。反而在后续操作中,错误匹配到10中的1,引发替换异常。 - 替换值提前固化:
str(number())会在执行re.sub前就调用number()生成固定字符串,而非每次匹配时动态生成递增数值。连续10次调用number()直接将num从9累加到19,导致最终替换值异常。 - 替换顺序冲突:先替换单个数字再替换
10,会把10中的1提前替换,比如最后替换1时用了19,导致10变成190。
解决方案
方案1:正则+动态回调函数(简洁高效)
用正则匹配1-10的完整数字,将递增函数作为替换回调,每次匹配时动态生成新值:
import re filename = "myfile.txt" num = 9 def number(match): global num num += 1 return str(num) with open(filename, "r") as f: contents = f.read() # 匹配1-10的完整数字,避免匹配数字片段 contents = re.sub(r'\b(10|[1-9])\b', number, contents) with open(filename, "w") as f: f.write(contents)
方案2:逐行处理(直观易调试)
直接读取每行内容,提取数字后加9(1→10、10→19均为加9),保留原格式:
filename = "myfile.txt" processed_lines = [] with open(filename, "r") as f: for line in f: raw_num = line.strip() if raw_num.isdigit(): new_num = int(raw_num) + 9 # 替换行内的原数字,保留前导空格 processed_line = line.replace(raw_num, str(new_num)) processed_lines.append(processed_line) with open(filename, "w") as f: f.writelines(processed_lines)
验证结果
两种方案执行后,文件内容均符合期望:
10 11 12 13 14 15 16 17 18 19
内容的提问来源于stack exchange,提问作者Maiinjoon
相关产品推荐
相关产品推荐

