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

无法修复python中的文件处理问题,python,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()

我编写了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_标签
REL_ts07n0g42p22sadsl01msaA04_2018-09-11-11-01

将qa_标签设置为苛刻


预期结果是,在我的文件中,它应该反映与上面相同的结果,但它不是

,如果您希望看到更改在磁盘上受到影响,则需要将更改写回磁盘。正如@ImpershableNight所说,你不想通过尝试写入一个你也在读取的文件来实现这一点……你想写入一个新文件。下面是您的代码的扩展版本,它可以做到这一点:

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)

打开临时文件以写入更新的文件内容,然后打开文件进行写入

修改行后,将其写回文件中

重新导入
导入文件输入
从临时文件导入临时文件
将临时文件()作为t:
打开(“Fdrc.tcl”、“r”)作为文件读取器:
对于文件读取器中的行:
if line.find(“设置qa_标签”)!=-1:
t、 写(
str.encode(
关于分项工程(r'REL.*,'harsh',str(直线))
)
)
其他:
t、 写入(str.encode(行))
t、 搜索(0)
以open(“Fdrc.tcl”、“wb”)作为文件写入程序:
文件写入器写入线(t)

这是我今天看到的第二个问题,它询问如何“更改”文件的内容。一般来说你不会。您可以将所有数据读入内存,对其进行修改,然后将其写回同一个文件;或者先将结果写入单独的文件,然后重命名以覆盖原始文件。保存文件修改版本的逻辑在哪里?在这段代码中,您根本没有写入文件。我想知道是否有一个重复的问题可以向人们指出。您好,这会在文件中搜索一个模式,并在外壳上打印,然后更改子字符串,但它在需要更改的文件中没有实际更改您好,我需要在原始文件中更改这会创建一个新文件,但我必须使用原始文件它不会有帮助请建议代码在原始文件中进行更改这真的有效吗?你测试过了吗?我从未见过在同一个文件上同时打开两个文件句柄。但是我想,因为只有一个正在打开文件进行写入,所以它可能还可以。然而,为什么要增加这种复杂性呢?您的解决方案不需要同时提供
文件读取器
文件写入器
。为什么不像我的解决方案那样在关闭文件进行读取后再打开文件进行写入?另外,为什么要在写入临时文件时强加额外的磁盘IO,只是为了将结果写入另一个文件?完全运行时,它实际上不起作用。我更新了以解决这个问题。在写这个答案时,我在一个repl中进行了测试。“为什么不像解决方案那样关闭文件以便读取后再打开文件进行写入?”这是正确的处理方法。“为什么要在写入临时文件时使用额外的磁盘IO”我同意在大多数情况下内存更便宜。我不确定内存中更多数据的结果是什么。