使用python更改一个文件夹中所有文件内容

python设置中文编码

在程序的开头加上一句

1
2
#!/usr/bin/python
# coding=utf-8

其中第一行是将py文件设置成可直接使用./name.py执行
第一行不适用于windows,而且中间不能有空格
第二行等式两边不能有空格,加上第二行就可以中文输出了

python正则表达式

re.search方法

一、函数语法

1
re.search(pattern, string, flags=0)

二、函数参数说明

参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

匹配成功re.search方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法 函数
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

三、实例

1
2
3
4
5
6
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配

以上实例运行输出结果为:

(0, 3)
(11, 14)

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python
import re

line = "Cats are smarter than dogs";

searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)

if searchObj:
print "searchObj.group() : ", searchObj.group()
print "searchObj.group(1) : ", searchObj.group(1)
print "searchObj.group(2) : ", searchObj.group(2)
else:
print "Nothing found!!"

以上实例执行结果如下:

searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter

findall

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
语法格式为:

findall(string[, pos[, endpos]])

参数:

  • string:待匹配的字符串。
  • pos:可选参数,指定字符串的起始位置,默认为 0。
  • endpos: 可选参数,指定字符串的结束位置,默认为字符串的长度。

查找字符串中的所有数字:

1
2
3
4
5
6
7
8
9
10
# -*- coding:UTF8 -*-

import re

pattern = re.compile(r'\d+') # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)

print(result1)
print(result2)

输出结果:

[‘123’, ‘456’]
[‘88’, ‘12’]

检索和替换

Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:

re.sub(pattern, repl, string, count=0, flags=0)

参数:

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import re

phone = "2004-959-559 # 这是一个国外电话号码"

# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num

# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)
print "电话号码是 : ", num

以上实例执行结果如下:

电话号码是: 2004-959-559
电话号码是 : 2004959559

repl 参数是一个函数

以下实例中将字符串中的匹配的数字乘以 2:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import re

# 将匹配的数字乘以 2
def double(matched):
value = int(matched.group('value'))
return str(value * 2)

s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))

执行输出结果为:

A46G8HFD1134

使用python更换文件内容

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/python
# coding=utf-8
import os
import re

def cos_to_cdn(path,patterm,repl):
files = os.listdir(path)
for file in files:
if os.path.isdir(path+'/'+file):
cos_to_cdn(path+'/'+file,patterm,repl)
else:
s = ''
f = open(path+'/'+file,'r')
for line in f:
if re.findall(patterm,line):
line = re.sub(patterm,repl,line)
s += line
f.close()
fw = open(path+'/'+file,'w')
fw.write(s)
fw.close()

path = r'******' #输入要替换的文件夹
patterm = r'*********' #要替换的字符串的正则表达式
repl = r'*********' #替换后的字符串
cos_to_cdn(path,patterm,repl)

此脚本可以迭代替换,也就是说如果文件夹中还有文件夹,则子文件夹中的内容也会被替换