这是我的代码,分别用mike和jim替换kyle和john的所有出现次数。
import os
import fileinput
import sys
rootdir ='C:/Users/sid/Desktop/app'
searchTerms={"kyle":"mike","john":"jim"}
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 key,value in searchTerms.items():
replaceAll(path,key,value)
这对我创建的测试目录工作正常。 当我将rootdir更改为我的实际java项目目录时,我得到了
Traceback (most recent call last):
File "C:\Users\sid\Desktop\test_iterator.py", line 19, in <module>
replaceAll(path,key,value)
File "C:\Users\sid\Desktop\test_iterator.py", line 10, in replaceAll
for line in fileinput.input(file, inplace=1):
File "C:\Python33\lib\fileinput.py", line 261, in __next__
line = self.readline()
File "C:\Python33\lib\fileinput.py", line 330, in readline
os.rename(self._filename, self._backupfilename)
FileExistsError: [WinError 183] Cannot create a file when that file already exists: 'C:/Users/sid/Desktop/app/pom.template.xml.bak'
有人可以解释为什么我会收到此错误。我已经阅读了关于os.rename()FileExistsError的帖子,但我无法理解它。有些人可以详细解释一下。
答案 0 :(得分:2)
当您使用fileinput.input(..., inplace=1)
时,输入文件将被重命名,您的代码在sys.stdout
上生成的任何输出都将写入具有原始文件名的新创建的文件。
fileinput
必须首先重命名原始文件,方法是在名称中添加.bak
。但是,它似乎已经存在 这样的文件。可能您之前的代码中存在错误,备份文件从未被删除。
确认C:/Users/sid/Desktop/app/pom.template.xml.bak
不包含您要保留的内容,然后将其删除或将其移回C:/Users/sid/Desktop/app/pom.template.xml
。
但是,如果你继续遇到这种情况,那么Python在自动删除备份文件时会遇到问题。在Windows上,这通常是因为另一个进程在后台继续为自己的目的打开文件。您可以尝试在超时后删除备份文件:
import time, os
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)
time.sleep(1) # wait 1 second, then delete the backup
os.remove(file + '.bak')
如果您的文件是只读的,请先将它们写入:
import os, stat
def replaceAll(file,searchExp,replaceExp):
readonly = not os.stat(myFile)[0] & stat.S_IWRITE
if readonly:
os.chmod(file, stat.S_IWRITE)
for line in fileinput.input(file, inplace=1):
if searchExp in line:
line = line.replace(searchExp,replaceExp)
sys.stdout.write(line)
if readonly:
os.chmod(file, stat.S_IREAD)