<p>文件被删除的原因是您在写入模式下重新打开它。执行此操作时,文件将被截断(清除)。请参阅<a href="https://docs.python.org/3/library/functions.html#open" rel="nofollow noreferrer">open()</a>描述。可以附加到文件,但不是您想要的</p>
<p>我认为XML解析器(如@andercurzbr answer中所建议的)是最好的解决方案。但是如果您想使用您的代码,您可以使用<a href="https://docs.python.org/3/library/fileinput.html" rel="nofollow noreferrer">fileinput</a>模块,它允许快速循环文件的行。这是一个使用fileinput编辑脚本的示例。它没有测试,但应该给你的想法</p>
<pre><code>import os
import fileinput
#VARIABLE TO CONCATENATE WITH THE FILE NAME
home = '/u01/app/oracle/mftxfer_adoc/DAYS/ola/'
#I WILL USE THIS FOLDER TO CHECK FOR FILES WITH THE NAME AJOG
directory = os.listdir('/u01/app/oracle/mftxfer_adoc/DAYS/ola/')
#THIS FILE IS MY FILTER LIST
word_list = open('/u01/app/oracle/mftxfer_adoc/DAYS/teste.txt').readlines()
#FOR EACH FILE THAT ENCOUNTERS ON THE DIRECTORY
for file_xml in directory:
#IF THE FILENAME HAS AJOG IN IT
if file_xml.__contains__('AJOG'):
print("Processing the file"+" "+file_xml)
#NOW WILL CHECK IF THE LINE CONTAINS A SPECIFIC STRING WITH FILEINPUT
for line in fileinput.input(home+file_xml, inplace=True):
if "<codigo>" in line:
#IF HAS THEN PICKS THE FILTER
for word_list_line in word_list:
#DEVIDES THE FILTER IN 2 COLUMNS
key = str((word_list_line.split(' ')[0]))
value = str((word_list_line.split(' ')[1]))
#CHECKS IF THE VALUE FROM THE FIRST COLUMN IN ON THE LINE OF THE AJOG FILE
if key in line:
#print("Found the value "+key+" on file "+file_xml)
#IF SO THEN REPLACE THE VALUE FROM THE FIRST COLUMN WITH THE SECOND COLUMN
file_read=line.replace(key, value)
#WRITES THE CHANGES TO THE LINE
print(file_read)
else:
print(line)
else:
print(line)
</code></pre>
<p>注意,当使用<code>inplace=True</code>选项时,输出被重定向到文件本身。从文档中:</p>
<blockquote>
<p>if the keyword argument inplace=True is passed to fileinput.input() or
to the FileInput constructor, the file is moved to a backup file and
standard output is directed to the input file (if a file of the same
name as the backup file already exists, it will be replaced silently).
This makes it possible to write a filter that rewrites its input file
in place.</p>
</blockquote>
<p>这意味着<code>print()</code>函数在调用<code>fileinput.input(home+file_xml, inplace=True)</code>写入文件之后调用。未编辑的行也必须打印出来,否则就会丢失,这就是为什么我添加了两个<code>else</code></p>