在位编辑文件行python 2.6
我有多个正在迭代的文件,对于每个文件,我检查模式是否存在,模式可以存在一次或多次,或者根本不存在。我想在找到模式后编辑具有该模式的行,并仅用该模式重写该行。如果该模式不存在,那么我将关闭该文件而不进行任何修改。 我的代码:在位编辑文件行python 2.6,python,regex,Python,Regex,我有多个正在迭代的文件,对于每个文件,我检查模式是否存在,模式可以存在一次或多次,或者根本不存在。我想在找到模式后编辑具有该模式的行,并仅用该模式重写该行。如果该模式不存在,那么我将关闭该文件而不进行任何修改。 我的代码: for root, dirs, files in os.walk('C:/Users/Documents/'): for fname in files: for line in fileinput.input(os.path.join(root
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)
问题是它在找到模式时会很好地更改模式,但对于没有模式的文件,它会完全删除其内容。如果模式存在于多行中,则只保留一行,并删除其余行。我错过了什么
编辑
我也可以灵活地使用开放式或任何其他方法来解决我的问题。我主要担心的是我不想重写没有模式的文件中的行。出于跟踪目的,我只想修改具有该模式的文件。到目前为止,我的在线研究表明,我可以写入临时文件,然后将其作为原始文件使用,也可以读取所有行,然后再次写入所有行,无论该文件是否具有该模式。有没有更好的办法解决这个问题
但对于没有模式的文件,它会完全删除其内容
是的,因为fileinput.input就是这样工作的。您需要打印所有行,无论是否更改它们
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
还考虑使用Sy.StdOut.WrdLead作为打印添加新的行。而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
谢谢@Vallentin的回答!你能回顾一下我编辑过的问题吗?谢谢@Vallentin更新的答案,很好用。我面临的唯一问题是,它不断添加新行,而文件的行数几乎翻了一番。你知道是什么原因造成的吗?怎么解决?正如我在回答中提到的,这是因为你使用的是print而不是sys.stdout.write。