首次匹配指定字符串时Python写入函数未输出问题咨询
问题原因分析
你的函数没成功写入指定字符串的核心问题,是行首的空白字符让startswith匹配失效了。
看你test.txt里的目标行:
new code("<RANDOM>");
这行开头有多个空格,而你传入的after参数是"new code("。line.startswith(after)会严格从行的第一个字符开始匹配——行首是空格,自然和"new code("对不上,所以if条件永远不会触发,也就不会执行写入'hello'的逻辑。
解决办法
只需要调整匹配逻辑,忽略行首的空白后再判断即可,这里给你两种实用方案:
方案1:去除行首空白后匹配(精准匹配内容开头)
修改函数里的判断条件,用lstrip()去掉行首所有空白字符(空格、制表符都算)后再做startswith判断:
if line.lstrip().startswith(after) and flag:
这样不管目标行前面有多少缩进,只要内容本身是以"new code("开头的,就能匹配成功。
方案2:检查行内是否包含目标字符串(宽松匹配)
如果你不需要严格要求是行内容的开头,只是想在第一次出现"new code("的行后面插入内容,可以直接判断字符串是否存在:
if after in line and flag:
不过这种方式要注意,如果行中其他位置意外出现"new code("也会触发,根据你的实际需求选择就行。
修正后的完整函数
def newstr(string, file_name, after): lines = [] with open(file_name, 'r') as f: for line in f: lines.append(line) with open(file_name, 'w+') as f: flag = True for line in lines: f.write(line) # 这里用方案1的逻辑,适配缩进场景 if line.lstrip().startswith(after) and flag: f.write(string+"\n") flag = False
现在再调用newstr('hello', "test.txt", "new code("),就能在第一行符合要求的内容后面成功写入hello了。
内容的提问来源于stack exchange,提问作者user9165298
相关产品推荐
相关产品推荐

