背景
作为一个测试,经常要造测试数据,大量的文件需要批量替换测试文件中的数据,一个一个更改太累,所以研究起怎么更改数据更快
遇到的问题
批量替换的源代码是网上借鉴来的,自己增加了循环可以替换多个字段。后来发现就像数据里面第一个update如果把后面的update条件弄没了一样,会替换失败,所以替换文字的'顺序'很重要。而且这东西是'区分大小写'的,怎么大小写忽略还没来得及研究。
开始把.py的文件和测试文件放在一起了,可是每次都运行失败,这才知道这东西运行起来'六亲不认',连自己都得内容都一起改。要么设置的遍历目录不增加自己这个代码文件,要么在循环中增加个if的判断条件,我选择了前者。
网上代码和可能是linux来的,和windows里面的'斜线'方向不一致,所以获取文件目录后自己替换了一下,就能用了。或许我也应该根据系统种类'os.name'写个if,让这个代码在多系统都能使用,健壮一些。
换行符的问题也困扰了我很久,linux下是'\n--LR',max下是'\r--CR'windows下是'\r\n--CRLF'。如果直接在循环中替换,整篇文件不换行(也可能是我的替换方式不对),后来发现在读取文件时'open()'后面加上newline=‘’的参数就好了。不带newline参数是根据系统类型'os.name',python自己判断,带\r是CR,带\n是LF,带空字符串是保持源文件不变。
代码
import os
#遍历目录下所有文件,连自己都不放过,所以自己在文件夹内会出错
fileDir = "C:/Users/Administrator/Desktop/PythonDemo/replace/sfs"
#文件内容大小写敏感,是依次替换
replace_list1 = [ #[oldvalue,newcalue]
["J","PY"],
["A","T"],
["V","H"],
["a","ON"]#,
]
#文件名称大小写敏感,是依次替换
replace_list2 = [ #[oldvalue,newcalue]
["2018-07-30","2019-01-02"],
["20180730","20190102"]#,
]
#获取目录下所有文件目录+名称
def listFiles(dirPath):
fileList=[]
for root,dirs,files in os.walk(dirPath):
for fileObj in files:
fileList.append(os.path.join(root,fileObj).replace("\\","/"))
return fileList
#替换内容
def replace_content():
fileList = listFiles(fileDir)
for fileObj in fileList:
print (fileObj)
f = open(fileObj,mode='r+',newline='')#newline=''表示不更改换行符
all_the_lines=f.readlines()
f.seek(0)
f.truncate()
for line in all_the_lines:
newline=line
for rp in range(len(replace_list1)):
newline=newline.replace(replace_list1[rp][0], replace_list1[rp][1])
f.write(newline)
f.close()
#替换名称
def replace_filename():
fileList = listFiles(fileDir)
for fileObj in fileList:
newname = fileObj
for rp2 in range(len(replace_list2)):
newname=newname.replace(replace_list2[rp2][0], replace_list2[rp2][1])
os.rename(fileObj,newname)
print (newname)
#运行
if __name__=='__main__':
replace_content()
replace_filename()