编辑文件行到位python 2.6

时间:2017-03-30 21:11:18

标签: 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, 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]表明我可以写入临时文件,稍后将其用作原始文件或读取所有行,然后再次写入所有行如果文件有模式。有没有更好的方法来解决这个问题?

1 个答案:

答案 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