打开目录中的每个文本文件,然后替换每个中的特定行

时间:2015-07-20 18:05:17

标签: python

我有一些代码会遍历目录中的每个文件,但我需要的是迭代的每个文件,但特定的行将替换为新值。任何人都可以在下面的代码中为我填写遗漏的空白吗?

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)

3 个答案:

答案 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()