Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在位编辑文件行python 2.6_Python_Regex - Fatal编程技术网

在位编辑文件行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。