Python 进阶 之 递归获取指定文件夹下所有指定后缀名文件,并且正则表达式re修改所有文件指定内容

Python 进阶 之 递归获取指定文件夹下所有指定后缀名文件,并且正则表达式re修改所有文件指定内容

目录

Python 进阶 之 递归获取指定文件夹下指定后缀名文件,并且正则表达式re修改文件指定内容

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、实现步骤

六、关键代码

七、附加 :python 修改文件内容的三种方式

1、直接修改原文件内容

扫描二维码关注公众号,回复: 14393950 查看本文章

2、把原文件副本写入,然后在删除替换原文件

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")

猜你喜欢

转载自blog.csdn.net/u014361280/article/details/125960902
今日推荐