无法修复python中的文件处理问题

时间:2019-06-14 05:31:33

标签: python

我编写了python代码以在tcl文件中搜索模式并将其替换为字符串,它会打印输出,但不会将其保存在tcl文件中

import re
import fileinput
filename=open("Fdrc.tcl","r+")
for i in filename:
    if i.find("set qa_label")!=-1:
        print(i)
        a=re.sub(r'REL.*','harsh',i)
        print(a)
filename.close()

实际结果

  

设置qa_label
  REL_ts07n0g42p22sadsl01msaA04_2018-09-11-11-01

     

将qa_label设置为苛刻

预期结果是在我的文件中它应该反映与上述相同的结果,但事实并非如此

2 个答案:

答案 0 :(得分:0)

如果要查看更改在磁盘上的影响,则需要将更改实际写回到磁盘上。就像@ImperishableNight所说的那样,您不想通过尝试写入要从中读取文件的方式来执行此操作...您要写入新文件。这是执行此操作的代码的扩展版本:

import re
import fileinput
fin=open("/tmp/Fdrc.tcl")
fout=open("/tmp/FdrcNew.tcl", "w")
for i in fin:
    if i.find("set qa_label")!=-1:
        print(i)
        a=re.sub(r'REL.*','harsh',i)
        print(a)
        fout.write(a)
    else:
        fout.write(i)
fin.close()
fout.close()

输入和输出文件内容:

> cat /tmp/Fdrc.tcl
set qa_label REL_ts07n0g42p22sadsl01msaA04_2018-09-11-11-01

> cat /tmp/FdrcNew.tcl
set qa_label harsh

如果要覆盖原始文件,则需要将整个文件读入内存并关闭输入文件流,然后再次打开该文件进行写入,并将修改后的内容写入同一文件。

这是代码的更清洁版本,可以执行此操作...生成内存中的结果,然后使用新的文件句柄将其写出。我仍在此处写入其他文件,因为通常至少在测试代码时,这就是您要执行的操作。您可以简单地更改第二个文件的名称以使其与第一个文件匹配,此代码将使用修改后的内容覆盖原始文件:

import re

lines = []

with open("/tmp/Fdrc.tcl") as fin:
    for i in fin:
        if i.find("set qa_label")!=-1:
            print(i)
            i=re.sub(r'REL.*','harsh',i)
            print(i)
        lines.append(i)

with open("/tmp/FdrcNew.tcl", "w") as fout:
    fout.writelines(lines)

答案 1 :(得分:0)

打开一个用于写入更新的文件内容的临时文件,然后打开该文件以进行写入。

修改这些行之后,将其写回到文件中。

import re
import fileinput
from tempfile import TemporaryFile


with TemporaryFile() as t:
    with open("Fdrc.tcl", "r") as file_reader:
        for line in file_reader:
            if line.find("set qa_label") != -1:
                t.write(
                str.encode(
                    re.sub(r'REL.*', 'harsh', str(line))
                    )
                )
            else:
                t.write(str.encode(line))
        t.seek(0)

    with open("Fdrc.tcl", "wb") as file_writer:
        file_writer.writelines(t)