【python 您所在的位置:网站首页 python批量替换文本内容 【python

【python

2023-01-02 04:54| 来源: 网络整理| 查看: 265

文章目录 🚩 写在前面 ⭐ 功能规划(以掘金为例) 📜 开始干活 🌻 产品新鲜出炉(代码实现) 🌾 效果展示 🧭 待改进的地方 🚩 写在前面

前几天学习了python的文件读取操作,可以用来干点什么呢?嘿,正好很多平台都推出了博客月更活动,但由于不同的平台环境(如markdown语法差别、活动要求),每搬运一篇博客都要幸苦地进行一些 重复性的手动修改,实在是麻烦。 人生苦短,我决定试试 python 能不能帮我做这件事。

小贴士: 不必完全按照文章的编写顺序阅读,可以先试着看看 效果展示。

⭐ 功能规划(以掘金为例)

1、其实我们需要做的事情很简单,就是对文本进行一些 增添、删除和替换。要把博客搬运到掘金,首先要面对一些掘金不支持(或效果不同)的 markdown 语法:

掘金不支持CSDN中双等号的高亮语法 ==高亮文本== 。 掘金不支持像 *.png =x300这样调整图片大小的语法。 掘金连续两行显示中间只有一个空格,只会换行一空 [En]

the Nuggets’ two consecutive lines show that there is only one space in the middle, and only a blank line will be wrapped.*

掘金不支持用 @[toc]在博客中显示文章目录。

2、如果你要参加 更文活动,往往还需要再博客中附上相应的活动描述、活动链接:

需要去掉CSDN的更文活动链接,例如: CSDN话题挑战赛第2期 参赛话题:学习笔记 然后加上掘金的更文活动链接,例如: *持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第N天,点击查看活动详情

3、为了让博客更加美观,还可以加上掘金的 markdown 主题:

4、最后,还可以做一些个性化的修改:

例如,在自己CSDN个人主页的链接前,加上CSDN标志词 📜 开始干活

虽然学了文本的读取,但我还不会使用 python 进行文本的替换,怎么办呢?此时我们打开 CSDN的搜索框,输入: python 替换文件内容,然后 C一下 😄

【python-致用】为嫖掘金月更奖品,我用刚学的python做了个批量文件内容替换

于是我找到了以下能 r u n run r u n 的代码:(原文链接,Python 修改文件内容3种方法(替换文件内容))

import 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: 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", "测试")

上面这段代码将文本替换的操作打包在了一个函数里,只能说真的很棒, copy 下来马上就能投入使用。但这还只有文本的替换,我们还需要 添加和删除文本,要怎么办呢?

删除: 将目标文本替换为空字符串即可,例如: alter("file1", "python", "") 添加: 可在原代码基础上做些修改即可,请看下面的代码 import os def add_font(file, text): with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2: f2.write(text) for line in f1: f2.write(line) os.remove(file) os.rename("%s.bak" % file, file)

但是,一次只能替换一个文件中的内容,如果你有 50 篇博客要搬运,就要将脚本运行 50 次,是不是太慢了?于是我们还可以试着实现 文件的批量操作,利用下面的代码我们就能得到当前 python 脚本所在目录下, 所有文件名构成的一个列表。可以自己试着用 pirnt(dirs)打印出来看一看。

path = './' dirs = os.listdir(path)

但是请一定小心,我们要修改的只是记录博客的 markdown 文件,后缀为 .md,不要把其它的文件也修改掉了。 小贴士:最好将该 python 脚本单独放在一个专用的文件目录下!。

可以使用 通配符来进行 .md文件的筛选:(参考资料:【Python】python通配符,使用通配符进行字符串匹配 )

# 记得导入依赖的包! from fnmatch import fnmatch print(fnmatch(filename, '*.md'))

如果文件 filename后缀为 .md, fnmatch函数就会返回 true,否则返回 false 。

🌻 产品新鲜出炉(代码实现)

计划差不多完成了,所以让我们开始实现它吧:

[En]

The plan is almost done, so let’s start to make it happen:

# -*- coding: utf-8 -*- import os from fnmatch import fnmatch # ----------------------------------------------------------------------------------------------- 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) # ----------------------------------------------------------------------------------------------- def add_font(file, text): # 在开头添加一段字符串 with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2: f2.write(text) for line in f1: f2.write(line) os.remove(file) os.rename("%s.bak" % file, file) # ----------------------------------------------------------------------------------------------- # 主程序 path = './' # 该 py 脚本所在目录 dirs = os.listdir(path) num = 1 for filename in dirs: if(fnmatch(filename, '*.md')): print(str(num) + ' ' + filename) num = num + 1 print('以上为当前目录下的所有 md 文件,是否继续替换?\n') input('按回车开始替换') for filename in dirs: if(fnmatch(filename, '*.md')): print('已替换:'+filename) add_font(filename, "---\ntheme: healer-readable\n---\n持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第N天,[点击查看活动详情](https://juejin.cn/post/7147654075599978532 \"https://juejin.cn/post/7147654075599978532\")\n") alter(filename, "[清风莫追]", "[CSDN清风莫追]") alter(filename, " =300x", "") alter(filename, " =400x", "") alter(filename, " =500x", "") alter(filename, "==", "**") alter(filename, ">个", ">\n>个") alter(filename, ">系", ">\n>系") alter(filename, ">推", ">\n>推") alter(filename, "> 个", ">\n> 个") alter(filename, "> 系", ">\n> 系") alter(filename, "> 推", ">\n> 推") alter(filename, "@[toc]", "") alter(filename, "[CSDN话题挑战赛第2期](https://marketing.csdn.net/p/7b6697fd9dd3795a268d1a6f2fe75012)", "") alter(filename, "参赛话题:[学习笔记](https://activity.csdn.net/creatActivity?id=10213)", "") print("已将所有md文档替换为掘金10月月更版本!") 🌾 效果展示

左:替换后的效果 | 右:原始效果

【python-致用】为嫖掘金月更奖品,我用刚学的python做了个批量文件内容替换

第一步: 将写好的脚本和待替换的文件放在同一目录下

【python-致用】为嫖掘金月更奖品,我用刚学的python做了个批量文件内容替换

第二步: 运行脚本(注意不是直接点击运行,我们假设你已经懂得如何运行python文件)

【python-致用】为嫖掘金月更奖品,我用刚学的python做了个批量文件内容替换

然后就 O K OK O K 啦,快将你替换后的文件复制到掘金看看效果吧!

; 🧭 待改进的地方

1、 换行: 连续的两行在掘金中将被当作一行,当中间有空行时,才显示为两行。但是我又不能简单地在所有行末都加上一个换行符,比如在贴代码时,换行又不会需要中间有空行。这个还没想好怎么处理。2、 通配符: 搜索待替换的文本时,最好可以用到通配符的方法。比如调整图片比例的语法会产生很多相似的字符串: =x500, =x400, =x300。3、 不够自动化: 还是要先将博客从CSDN上一篇一篇地导出到本地,要是以后可以自动爬取下来就好了。4、 使用不够方便: 当文本替换的需求变化时,就需要 在代码里进行修改。······欢迎提出您自己的建议!

[En]

Welcome to put forward your own suggestions!

个人主页-CSDN:清风莫追

Original: https://blog.csdn.net/m0_63238256/article/details/127158080Author: 清风莫追Title: 【python-致用】为嫖掘金月更奖品,我用刚学的python做了个批量文件内容替换

相关阅读 Title: 【赵渝强老师】在MongoDB中使用MapReduce方式计算聚合

【python-致用】为嫖掘金月更奖品,我用刚学的python做了个批量文件内容替换

MapReduce 能够计算非常复杂的聚合逻辑,非常灵活,但是,MapReduce非常慢,不应该用于实时的数据分析中。MapReduce能够在多台Server上并行执行,每台Server只负责完成一部分wordload,最后将wordload发送到Master Server上合并,计算出最终的结果集,返回客户端。MapReduce的基本思想,如下图所示:

【python-致用】为嫖掘金月更奖品,我用刚学的python做了个批量文件内容替换

在这个例子中,我们以一个求和为例。首先执行Map阶段,把一个大任务拆分成若干个小任务,每个小任务运行在不同的节点上,从而支持分布式计算,这个阶段叫做Map(如蓝框所示);每个小任务输出的结果再进行二次计算,最后得到结果55,这个阶段叫做Reduce(如红框所示)。

使用MapReduce方式计算聚合,主要分为三步:Map,Shuffle(拼凑)和Reduce,Map和Reduce需要显式定义,shuffle由MongoDB来实现。

Map:将操作映射到每个doc,产生Key和Value Shuffle:按照Key进行分组,并将key相同的Value组合成数组 Reduce:把Value数组化简为单值

我们以下面的测试数据(员工数据)为例,来为大家演示。

javascript;gutter:true; db.emp.insert( [ {_id:7369,ename:'SMITH' ,job:'CLERK' ,mgr:7902,hiredate:'17-12-80',sal:800,comm:0,deptno:20}, {_id:7499,ename:'ALLEN' ,job:'SALESMAN' ,mgr:7698,hiredate:'20-02-81',sal:1600,comm:300 ,deptno:30}, {_id:7521,ename:'WARD' ,job:'SALESMAN' ,mgr:7698,hiredate:'22-02-81',sal:1250,comm:500 ,deptno:30}, {_id:7566,ename:'JONES' ,job:'MANAGER' ,mgr:7839,hiredate:'02-04-81',sal:2975,comm:0,deptno:20}, {_id:7654,ename:'MARTIN',job:'SALESMAN' ,mgr:7698,hiredate:'28-09-81',sal:1250,comm:1400,deptno:30}, {_id:7698,ename:'BLAKE' ,job:'MANAGER' ,mgr:7839,hiredate:'01-05-81',sal:2850,comm:0,deptno:30}, {_id:7782,ename:'CLARK' ,job:'MANAGER' ,mgr:7839,hiredate:'09-06-81',sal:2450,comm:0,deptno:10}, {_id:7788,ename:'SCOTT' ,job:'ANALYST' ,mgr:7566,hiredate:'19-04-87',sal:3000,comm:0,deptno:20}, {_id:7839,ename:'KING' ,job:'PRESIDENT',mgr:0,hiredate:'17-11-81',sal:5000,comm:0,deptno:10}, {_id:7844,ename:'TURNER',job:'SALESMAN' ,mgr:7698,hiredate:'08-09-81',sal:1500,comm:0,deptno:30}, {_id:7876,ename:'ADAMS' ,job:'CLERK' ,mgr:7788,hiredate:'23-05-87',sal:1100,comm:0,deptno:20}, {_id:7900,ename:'JAMES' ,job:'CLERK' ,mgr:7698,hiredate:'03-12-81',sal:950,comm:0,deptno:30}, {_id:7902,ename:'FORD' ,job:'ANALYST' ,mgr:7566,hiredate:'03-12-81',sal:3000,comm:0,deptno:20}, {_id:7934,ename:'MILLER',job:'CLERK' ,mgr:7782,hiredate:'23-01-82',sal:1300,comm:0,deptno:10} ] );

# (案例一)求员工表中,每种职位的人数 ;gutter:true;var map1=function(){emit(this.job,1)}var reduce1=function(job,count){return Array.sum(count)}db.emp.mapReduce(map1,reduce1,{out:"mrdemo1"})

(案例二)求员工表中,每个部门的工资总和

javascript;gutter:true; var map2=function(){emit(this.deptno,this.sal)} var reduce2=function(deptno,sal){return Array.sum(sal)} db.emp.mapReduce(map2,reduce2,{out:"mrdemo2"})

# (案例三)Troubleshoot the Map Function ;gutter:true;定义自己的emit函数:var emit = function(key, value) {print("emit");print("key: " + key + " value: " + tojson(value));}

测试一条数据:emp7839=db.emp.findOne({_id:7839})map2.apply(emp7839)输出以下结果:emitkey: 10 value: 5000

测试多条数据:var myCursor=db.emp.find()while (myCursor.hasNext()) { var doc = myCursor.next(); print ("document _id= " + tojson(doc._id)); map2.apply(doc); print();}

(案例四)Troubleshoot the Reduce Function

javascript;gutter:true; 一个简单的测试案例 var myTestValues = [ 5, 5, 10 ]; var reduce1=function(key,values){return Array.sum(values)} reduce1("mykey",myTestValues)

测试:Reduce的value包含多个值 测试数据:薪水、奖金: var myTestObjects = [ { sal: 1000, comm: 5 }, { sal: 2000, comm: 10 }, { sal: 3000, comm: 15 } ]; 开发reduce方法: var reduce2=function(key,values) { reducedValue = { sal: 0, comm: 0 }; for(var i=0;i

【python-致用】为嫖掘金月更奖品,我用刚学的python做了个批量文件内容替换

Original: https://www.cnblogs.com/collen7788/p/13662639.htmlAuthor: 赵渝强老师Title: 【赵渝强老师】在MongoDB中使用MapReduce方式计算聚合

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/282675/

转载文章受原作者版权保护。转载请注明原作者出处!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有