我有一些代码会遍历目录中的每个文件,但我需要的是迭代的每个文件,但特定的行将替换为新值。任何人都可以在下面的代码中为我填写遗漏的空白吗?
import os
line_old = ''
line_new = ''
for file in os.listdir("/mydir"):
if file.endswith(".txt"):
#something that will work, rather than the below example
file.replace(line_old, line_new)
答案 0 :(得分:2)
glob会找到所有.txt
个文件,然后您可以使用fileinput.input遍历每个文件的行,并用inplace=True
替换原始文件中的行:
line_old = ''
line_new = ''
import fileinput
import sys
import glob
for line in fileinput.input(glob.iglob("/mydir/*.txt"),inplace=True):
if line.strip() == line_old:
sys.stdout.write(line_new+"\n")
else:
sys.stdout.write(line)
或者写信给tempfile.NamedTemporaryFile并使用shutil.move替换原始文件:
import glob
from shutil import move
from tempfile import NamedTemporaryFile
for fle in glob.iglob("./*.txt"):
with open(fle) as f,NamedTemporaryFile(dir=".",delete=False) as temp:
for line in f:
if line.rstrip() == line_old:
temp.write(line_new + "\n")
else:
temp.write(line)
move(temp.name,fle)
这假设您实际上正在改变整行,如果您匹配特定模式,您可以使用正则表达式并且逻辑将完全相同,只需编译正则表达式并使用re.sub
import re
r = re.compile(r"\bfoo bar\b")
re.sub(line_old,line_new)
答案 1 :(得分:1)
with open(file) as f:
data = f.read().replace(line_old,line_new)
with open(file,"w") as f:
f.write(data)
答案 2 :(得分:1)
这可能更简洁,但它会起作用。
f = open(file,'r')
lines = f.readlines()
f.close()
f = open(file,'w')
for line in lines:
if line_old in line:
line = line_new
f.write(line)
f.close()