Python 进阶 之 递归获取指定文件夹下所有指定后缀名文件,并且正则表达式re修改所有文件指定内容
目录
Python 进阶 之 递归获取指定文件夹下指定后缀名文件,并且正则表达式re修改文件指定内容
3、使用正则表达式re 方式,把原文件副本写入,然后在删除替换原文件
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
这里介绍递归获取指定文件夹下的所有文件,并且针对指定类型的文件进行内容修改,这里使用正则表达式re修改特定的内容(这里是把指定后缀txt文件内容中的单双引号的内容添加一个@符号),这里简单介绍,方法不唯一,如果不足或更好的方法,还请留言补充。
操作环境:
1、win 10
2、python 3.8
3、pycharm 2022.1.3
二、实现原理
1、os.listdir 读取文件夹下的所有文件,如果是文件 os.path.isfile ,且是指定txt后缀类型文件,进行对应数据修改
2、如果是文件夹,递归第一步处理即可
3、其中 open(filePath, "r", encoding="utf-8") 读取指定文件内容文件
4、然后 regArray = re.findall(reg, content) 寻找指定内容,tmpContent = re.sub(r, '@' + r, tmpContent) 修改指定内容,这里是在指定内容上添加一个 @ 符号
三、注意事项
1、读取的文件注意编码格式是 utf-8
四、效果预览
修改前:文件夹下的.txt文件内容
修改后:文件夹下的.txt文件内容(单双引号内容添加一个@)
五、实现步骤
1、准备环境文件夹 和 txt,TestFolder 文件夹下添加 1 文件夹,aa.txt 和 aa.txt.js,然后 1 文件夹下,添加 aa.txt 和aa2.txt,其中内容都是第三张图
sdfa史蒂夫
test "apple",a beautiful "pear" haha test 'peach' ! a big 'orange' xixi
test 'peach' ! a big 'orange' xixi
test "apple",a beautiful "pear" haha
奥术大师发
s
2、首先实现递归读取文件夹下的文件,主要是 os.listdir 相关
3、其次 open 读取文件内容
4、通过 re 解析数据,并匹配的数据添加 @
5、最后实现针对后缀 txt 文件处理修改内容
6、添加指定文件夹路径,运行脚本,指定文件夹下及子文件加下的内容都对应规则添加 @ 符号
六、关键代码
import os
import re
def recursiveGetFilesFromFolder(folderPath, fileHandler):
"""
递归获取文件夹下的文件,并做对应处理
:param folderPath: 文件夹路径
:param fileHandler: 对文件的处理函数
:return:
"""
pathDir = os.listdir(folderPath)
print("pathDir = ", pathDir)
for fileOrDir in pathDir:
fileOrDirPath = os.path.join('%s\%s' % (folderPath, fileOrDir))
print("child = " + fileOrDirPath)
if os.path.isfile(fileOrDirPath):
if fileHandler:
fileHandler(fileOrDirPath)
continue
# 是文件夹,则递归处理
recursiveGetFilesFromFolder(fileOrDirPath, fileHandler)
def modifyFile(filePath):
"""
读取修改指定文件内容
:param filePath: 文件路径
:return:
"""
with open(filePath, "r", encoding="utf-8") as f1, open("%s.bak" % filePath, "w", encoding="utf-8") as f2:
for line in f1:
f2.write(modifyContent(line))
os.remove(filePath)
os.rename("%s.bak" % filePath, filePath)
def modifyContent(content):
"""
获取内容中的单双引号内的内容前添加一个 @
:param content: 要修改的内容
:return: 返回修改后的内容
"""
reg = re.compile(r"""["'](.*?)["']""")
regArray = re.findall(reg, content)
tmpContent = content
if regArray:
for r in regArray:
tmpContent = re.sub(r, '@' + r, tmpContent)
return tmpContent
def handleTxtFile(filePath):
"""
处理txt后缀的文件
:param filePath:文件路径
:return:
"""
if filePath.endswith(".txt"):
modifyFile(filePath)
def test():
recursiveGetFilesFromFolder(r'E:\Study\z_tmp\TestFolder', handleTxtFile)
if __name__ == '__main__':
test()
七、附加 :python 修改文件内容的三种方式
1、直接修改原文件内容
def alter(file,old_str,new_str):
"""
替换文件中的字符串
:param file:文件名
:param old_str:就字符串
:param new_str:新字符串
:return:
"""
file_data = ""
with open(file, "r", encoding="utf-8") as f:
for line in f:
if old_str in line:
line = line.replace(old_str,new_str)
file_data += line
with open(file,"w",encoding="utf-8") as f:
f.write(file_data)
alter("file1", "09876", "python")
2、把原文件副本写入,然后在删除替换原文件
import os
def alter(file,old_str,new_str):
"""
将替换的字符串写到一个新的文件中,然后将原文件删除,新文件改为原来文件的名字
:param file: 文件路径
:param old_str: 需要替换的字符串
:param new_str: 替换的字符串
:return: None
"""
with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2:
for line in f1:
if old_str in line:
line = line.replace(old_str, new_str)
f2.write(line)
os.remove(file)
os.rename("%s.bak" % file, file)
alter("file1", "python", "测试")
3、使用正则表达式re 方式,把原文件副本写入,然后在删除替换原文件
import re,os
def alter(file,old_str,new_str):
with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2:
for line in f1:
f2.write(re.sub(old_str,new_str,line))
os.remove(file)
os.rename("%s.bak" % file, file)
alter("file1", "admin", "password")