我是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。但是当我运行程序时,文件没有内容,甚至凯尔也不在那里。
你能告诉我我做错了什么吗?我认为问题出在我的replaceAll函数中。在行if searchExp in line
中没有正确执行。你能告诉我为什么吗?
答案 0 :(得分: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
答案 1 :(得分:1)
您必须编写所有行 - 不仅包括更改,因为fileinput.input()
(带有inplace=1
)将文本复制到temporaty文件以从中读取行并清除oryginal文件以再次写入所有行 - 但是您必须自己写所有的行。
您可以按照以下方式移动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
你必须自己做 - 从oryginal文件中读取所有行,将所有行写入临时文件,最后用临时文件替换oryginal文件。