2

我是 python 新手。

我必须搜索目录并找到其中包含字符串 kyle 和 john 的文件,并分别用 mike 和 jim 替换它们。每个文件可以有 kyle 或 john 或两者兼有。

这是我的代码

import os
import fileinput
import sys

rootdir ='C:/Users/sid/Desktop/test'
searchTerms = {"kyle":"mike","john":"jim"}
#old= "kyle"
#new = "mike"

def replaceAll(file,searchExp,replaceExp):
    for line in fileinput.input(file, inplace=1):
        if searchExp in line:
            line = line.replace(searchExp,replaceExp)
            sys.stdout.write(line)

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
            path=subdir+'/'+file
            for oldline, newline in searchTerms.items():
                replaceAll(path,oldline,newline)

现在我创建了一个测试文件夹,其中包含 sample.txt,在 sample.txt 中我有单词 kyle。但是当我运行程序时,文件没有内容,甚至 kyle 也不存在。你能告诉我我做错了什么吗?我认为问题出在我的 replaceAll 函数中。在行 if searchExp in line中没有得到正确执行。你能告诉我为什么吗?

4

2 回答 2

1

您必须编写所有行 - 不仅要进行更改,因为fileinput.input()(使用inplace=1)将文本复制到临时文件以从中读取行并清除原始文件以再次写入所有行 - 但您必须自己编写所有行。

您可以sys.stdout.write(line)如下移动以解决问题。

def replaceAll(file,searchExp,replaceExp):
    for line in fileinput.input(file, inplace=1):
        if searchExp in line:
            line = line.replace(searchExp,replaceExp)
        sys.stdout.write(line)

无需inplace=1您自己动手-从原始文件中读取所有行,将所有行写入临时文件,最后用临时文件替换原始文件。

于 2013-10-28T11:05:29.390 回答
1

fileinput.input(file, inplace=1)叫做in-place filtering

例如。

sample.txt哪一条线kyle kyle kyle

第一步,该行kyle kyle kyle被处理为mike mike mike.

然后,该行将mike mike mike被视为新的输入行。

新行中没有“kyle”或“john”,因此不会将输出写入sample.txt.


参考:http ://docs.python.org/2/library/fileinput.html#fileinput.FileInput

于 2013-10-28T10:07:01.173 回答