我有多个文件,我正在迭代,对于每个文件,我检查是否存在模式,模式可以存在一次或多次,或者根本不存在。我想在找到模式后编辑具有模式的行,并仅使用模式重写该行。如果模式不存在,那么我关闭文件而不做任何修改。 我的代码:
for root, dirs, files in os.walk('C:/Users/Documents/'):
for fname in files:
for line in fileinput.input(os.path.join(root, fname), inplace = 1):
if re.search(r"([\w-d])", line):
x=re.sub(r"([\w-d])", r"(\1).", line)
print line.replace(line,x)
问题是它在找到模式时会改变模式,但是对于没有模式的文件,它会完全删除它们的内容。如果模式存在于多行中,则仅保留一行并删除其余行。我错过了什么?
我也很灵活地使用"open"
或任何其他可以解决我的问题的方法。我主要担心的是我不想重写没有模式的文件中的行。出于跟踪目的,我只想修改具有该模式的文件。到目前为止,我的在线研究[1] [2] [3]表明我可以写入临时文件,稍后将其用作原始文件或读取所有行,然后再次写入所有行如果文件有模式。有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
但对于没有该模式的文件,它会完全删除其内容
是的,因为fileinput.input
的工作原理。无论你是否更改过,都需要print
所有行。
for line in fileinput.input(os.path.join(root, fname), inplace=1):
if re.search(r"([\w-d])", line):
x=re.sub(r"([\w-d])", r"(\1).", line)
print line.replace(line, x)
else:
print line
另请考虑使用sys.stdout.write(line)
,print
添加新行。而line
是从文件中读取的行,包括最后的新行。
因此,如果我们有一个名为test.txt
的文件,其中包含以下内容:
a1
b2
c3
然后,如果我们这样做:
for line in fileinput.input("test.txt", inplace=1):
if line.strip() == "b2":
sys.stdout.write("-> ")
sys.stdout.write(line)
else:
sys.stdout.write(line)
之后,文件将如下所示:
a1
-> b2
c3
所以你确实需要写不变的行。
修改强>
最灵活可能是这样做的。但是,您可以事先读取文件以检查模式是否存在,然后执行相同的操作:
f = open(os.path.join(root, fname), "r")
found = False
for line in f:
if re.search(r"([\w-d])", line):
found = True
break
f.close()
if found:
for line in fileinput.input(os.path.join(root, fname), inplace=1):
if re.search(r"([\w-d])", line):
x=re.sub(r"([\w-d])", r"(\1).", line)
print line.replace(line, x)
else:
print line