Python实战:批量修改文本文件
sub方法、listdir方法、with open as 函数的实战用法
一、需求:
目前我们有一个文件夹,里面有爬虫抓取的txt文档1000篇,但是由于抓取格式问题,每篇文章之后都有几行相同的乱码现在我们需要写一个程序去掉其中的乱码
所以我们需要:读文件目录,遍历其中文件,替换字段三个操作。其中替换字段是核心操作
二、功能拆解
第一步:设计一个用于字符串替换的正则表达式。——(调用re.sub()
方法)
第二步:对文件和对文件目录操作(或者用已有的目录表格操作)——with open as
语句、同时涉及读写文档
第三步:遍历文件,进行操作——os模块的os.listdir()
方法os.getcwd()
方法、循环(迭代器)、自定义函数
三、过程
第一步:设计一个可以修改字符串的程序
假设已知我们已经知道处理符合复杂规则的字符串需要正则表达式和re模块
根据需求,我们需要调用re.sub()方法来进行字符串的替换
import re #使用sub首先要导入re模块
re.sub(pattern,"替换的字符","被搜索的文件",count,flags)
此处 pattern 是指明匹配模式的模式字符串。这个串加上一个r或者R之后变为原生字符串,因为模式字符串中可能会有很多斜杠反斜杠。但是由于这个例子没有斜杠反斜杠,所以不加r也可以运行出结果。
第二步:接入文档
此处我们需要读写文件,先读入文件,替换字符,再写入文件
首先我们 命名一个path指明我们需要打开的文件名字
这个path的命名是可以改变的,也可以命名成file file_Object f1等等
格式为引号里面 文件名称加上引号里面文本格式
path = '填入你需要的文件名'+'.txt'
然后用with open语句打开文件
因为with 语句可以自动关上打开的文件,所以我们选用这个语句
open语句包含三个参数:第一个参数指出文件名,第二个参数指明使用文件的方式,第三个文件指明编码方式 as f1用于指明 打开后的文件的名字
注意: f1后面需要冒号,因为对此文件的操作需要相对于with缩进
with open(path,'r',encoding='utf-8') as f1:
打开文件后,需要把文件中的内容赋给一个字符串text1(此处text1是使用者自己命名,下文简写为‘自己命名’)
然后调用re.sub()方法替换字符,并把结果储存在text2(自己命名)中
此时我们已经把修改好的字符串存入text2。但是我们需要把text2写入原来的文本中,而’r’参数是只读方式打开文档,所以我们以’w’参数再打开一遍文档。【注意】:'w’方法的写入方式是清除原来的所有内容,再填入文本。 但是由于我们的操作是基于全部文本的,text2中储存正是我们需要的全体文本,所以可以使用’r’参数
因为我们之前是f1关掉了的,所以我们此处命名为f1也可以,但是为了避免混淆,我们是把他作为f2打开。
.flush()方法是把写入文件的内容立即保存。
【代码优化】
第一版代码是把一个文件只读打开,关上,再用只写打开
优化之后两个文件同时打开,只用开一个字符串,缩短代码
第一版
第二版
输入
输出
第三步:把设计好的程序封装成函数
使用def 创建函数cleantext(自己命名) 函数名后面需要有一个括号,括号里放函数的参数。这个函数的参数容易知道是文件的名字。
【注意】创建函数之后需要需要更改缩进量
第四步:调用目标文档所在目录,用列表储存目录,并通过循环调用函数
我们需要的文件是存在一个叫做’txt’的文档里面的,所以我们需要对txt目录进行操作
假设我们知道对目录进行操作需要使用os模块
所以我们首先导入os包
首先我们需要了解目前我们脚本的工作目录,通过os.getcwd()来检查我们的工作目录
然后把’txt’文件夹放入当前工作目录以便被操作
接下来我们需要获取’txt’目录下面的所有文件名,因为我们的最终操作是对目录下的文件的。
此处需要使用os.listdir()方法,该方法是用来获取目录下的文件名的
参数用来指明需要获取的路径,如果不填就默认获取当前工作目录文件名
该参数需要被引号引起来,由于我们已经把txt放在了操作目录之下,所以只需要运用相对路径即可。
我们已经把txt里的文件名称放入了’filenames’(自己命名)的列表中,现在我们通过迭代器操作里面的单个文件,并把参数’file’传入cleantext函数
然后我们需要更改cleantext的接口使其能够接受file参数
由于file是在txt目录下,而不是在当前工作目录下,所以我们在path变量的名字之前需要加入一个路径名,这个路径名也是相对路径,可以直接复制os.listdir()里面的路径名
【注意】如果不复制这个路径名,就会报错,显示找不到这个文件
调好接口,程序就可以运行!完结撒花
四、补充open参数的部分用法
open函数的使用方式和编码方式
path ='需要处理的文件名字'+'.txt'#后一个字符串是表示文件的格式的,注意txt前面有一个点
with open(path,'使用方式',encoding='编码方式' ) as
使用方式:'r’只读,'w’只写,'w+'清空内容后读写,'r+'读取后覆盖原内容
‘a’ 写入,‘a+’ 追加内容
编码方式;utf-8 ISO-8859-1 ansi 等等,编码方式不行的时候换一换。
五、sub函数用法
sub方法一共有五个参数:
第一个参数表示模式字符串:使用正则表达实现复杂的匹配模式
第二个参数表示替换对象(这个参数放你希望在结果中看到的字符串)
第三个参数表示被查找对象,全集
第四个参数表示替换次数(默认全部替换,不一定填入)
第五个参数控制匹配方式(可以不填)