1 切片操作
某字符串需要依据不同的分隔符来进行切分,例如
s = ‘abad:dasdfadf|asd|ddd\tasd;asdf,asdf;das,dedd,asdf|dd’ 其中 , ; \t | 都是分割符号
下面使用两种方法,建议使用方法2,但若只是按照一个切割,建议还是使用方法1.
方法1
res1 = [ss.split('|') for ss in s.split(';')]
#结果 [['abad:dasdfadf', 'asd', 'ddd\tasd'], ['asdf,asdf'], ['das,dedd,asdf', 'dd']]
res2 = list(map(lambda ss: ss.split('|'), s.split(';')))
#结果 同res1
对上面的结果展开
t = []
list(map(t.extend, res1)) # 注意:不加list,将不会执行。
t #['abad:dasdfadf', 'asd', 'ddd\tasd', 'asdf,asdf', 'das,dedd,asdf', 'dd']
sum(res1, []) #结果同 t
写一个切割函数
#正真的函数出来了
def mySplit1(s, seps):
res = [s]
for sep in seps:
t = []
list(map(lambda ss: t.extend(ss.split(sep)), res))
res = t
return res
mySplit1(s, ',;|\t')
# ['abad:dasdfadf',
# 'asd',
# 'ddd',
# 'asd',
# 'asdf',
# 'asdf',
# 'das',
# 'dedd',
# 'asdf',
# 'dd']
也可以这样,但是阅读性不好:
from functools import reduce
reduce(lambda l,sep:sum(map(lambda ss: ss.split(sep),l),[]), ',:|\t',[s])
或:
mySplit2 = lambda s, seps: reduce(lambda l,sep:sum(map(lambda ss: ss.split(sep),l),[]), seps,[s])
mySplit2(s, ',:|\t')
说明:
- lambda就是一个匿名函数,其实可以替换成一个函数就OK,冒号前面是参数,后面是函数返回值;
- map:map(function_to_apply, list_of_inputs),将后面列表逐个作用于前面的函数,参数和前面函数一致,返回的是一个迭代式,需要通过list生成返回。
- reduce:reduce(function, iterable[, initializer]),reduce的工作过程是 :在迭代sequence(tuple ,list ,dictionary, string等可迭代物)的过程中,首先把 前两个元素传给 函数参数,函数加工后,然后把得到的结果和第三个元素作为两个参数传给函数参数, 函数加工后得到的结果又和第四个元素作为两个参数传给函数参数,依次类推。 如果传入了 initial 值, 那么首先传的就不是 sequence 的第一个和第二个元素,而是 initial值和 第一个元素。经过这样的累计计算之后合并序列到一个单一返回值(可能是数,也可能是list,和初始化的值一致)。深入了解见下面代码或后面链接:https://www.cnblogs.com/lonkiss/p/understanding-python-reduce-function.html
from functools import reduce
scientists =({'name':'Alan Turing', 'age':105, 'gender':'male'},
{'name':'Dennis Ritchie', 'age':76, 'gender':'male'},
{'name':'Ada Lovelace', 'age':202, 'gender':'female'},
{'name':'Frances E. Allen', 'age':84, 'gender':'female'})
def group_by_gender(accumulator , value):
accumulator[value['gender']].append(value['name'])
return accumulator
grouped = reduce(group_by_gender, scientists, {'male':[], 'female':[]})
print(grouped) # {'male': ['Alan Turing', 'Dennis Ritchie'], 'female': ['Ada Lovelace', 'Frances E. Allen']}
方法2:使用正则表达式 re.split() — 推荐
import re
re.split('[,:|\t]+', s) #结果和上面一样
2 修改特定文件的权限
主要使用str.startswith和str.endswith方法import os
s = os.stat('test.py')
s # os.stat_result(st_mode=33188, st_ino=6586153450, st_dev=192, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1634441371, st_mtime=1634441371, st_ctime=1634441385)
oct(s.st_mode) #'0o100644' 33188十进制转换后为100644 ,644 分别是用户,组和其他的权限系数
! ls -lh test.py #-rw-r--r-- 1 root root 0 Oct 17 03:29 test.py
oct(s.st_mode | 0o100) # '0o100744' 添加用户的执行权限
实例 修改所有.py和.sh结尾的用户执行权限import stat
stat.S_IXUSR #XUSR 第一个字母是RWX之一,第二个可是 USR,GRP,OTH,对应:用户,组和其他
oct(stat.S_IXUSR) # '0o100' 所以也可以用这个
for fn in os.listdir():
if fn.endswith(('.py','.sh')):
fs = os.stat(fn)
os.chmod(fn, fs.st_mode | stat.S_IXUSR)
3 大量替换操作
比如log日志的日期由 ‘yyyy-mm-dd’修改为 ‘mm/dd/yyyy’的形式
方案:使用正则表达式re.sub方法操纵替换字符串,用正则表达式捕获组,捕获每个部分内容,再替换并调整顺序。f = open('t.txt')
log = f.read()
log #'2020-12-18\n2020-12-18\n2020-12-18\n2020-12-18\n2020-12-18\n2020-12-18\n'
import re
re.sub(r'(\d{4})-(\d{2})-(\d{2})',r'\2/\3/\1' , log) #'12/18/2020\n12/18/2020\n12/18/2020\n12/18/2020\n12/18/2020\n12/18/2020\n'
```pythonimport re
re.sub(r'(?P<y>\d{4})-(?P<m>\d{2})-(?P<d>\d{2})',r'\g<m>/\g<d>/\g<y>' , log) # 结果和上面一样
注意 转移字符的一些坑
‘\2’ #’\x02’ len(‘\2’) # 1 ‘\2’ # ‘\2’ r’\2’ # ‘\2’ len(‘\2’) # 1
ord(‘a’) # 97 oct(ord(‘a’)) #’0o141’ ‘\141’ # ‘a’
<a name="XkJYO"></a>
# 4 拼接字符串
<a name="tf7qO"></a>
## 方法一:'+' 号 或 迭代列表
```python
l = ['aaa','bbb','ccc','ddd']
s = ''
for x in l:
s += x
s # 'aaabbbcccddd'
from functools import reduce
reduce(str.__add__, l) #'aaabbbcccddd'
方法二:str.join() —推荐
''.join(l) # 'aaabbbcccddd'
','.join(l) # 'aaa,bbb,ccc,ddd'
时间比较
timeit ''.join(l) # 107 ns ± 0.916 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
timeit reduce(str.__add__, l) #353 ns ± 4.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
5 对其问题
如何输出对其的形式:比例{‘aaa’:100,’bbbbbb’:20,’ccccccc’:200},输出为:
aaa : 100
bbbbbb : 20
ccccccc : 200
方法1:使用ljust,rjust,center方法
s = 'abc'
s.ljust(10) #'abc '
len(s.ljust(10)) #10
s.ljust(10, '*') #'abc*******'
s.rjust(10, "^") #'^^^^^^^abc'
s.center(10, '@') #'@@@abc@@@@'
方法2:使用format方法
format(s, '<10') #同s.ljust(10) 'abc '
format(s, '*>10') #'*******abc'
format(s, '^10') #' abc '
#直接调用
n=5
n.__format__('>10') # ' 5'
format(-123, '=+10') #'- 123'
format(123, '=+10') #'+ 123'
format(-123, '0=+10') #'-000000123'
format(123, '0=+10') #'+000000123'
d = {'aaa':100,'bbbbbb':20,'ccccccc':200}
w = max(map(len, d.keys())) # 上述key的最大长度
for k,v in d.items():
print(k.ljust(w), ':', v)
# aaa : 100
# bbbbbb : 20
# ccccccc : 200
6 删除和替换字符串
方法1:字符串strip,lstrip,rstrip去掉两端的
s = ' \t sunwukong@126.com... \t'
s.strip() 'sunwukong@126.com...' # \t和空格默认删除
s.lstrip() # 'sunwukong@126.com... \t'
方法2:删除固定位置的,使用切片加拼接
s2 = 'sunwukong:123'
s2[:-4] + s2[-3:] # 'sunwukong123'
''.join(s2.split(':')) #'sunwukong123'
方法3:使用replace或正则表达式删除任意字符串
s2.replace(':','') #'sunwukong123'
s3 = '\t sun wu kong : 123 \n' # 要去掉 \t, ,:,\n
import re
re.sub('[ \t:\n]+','',s3) #'sunwukong123'
方法4:字符串translate(),可以删除多种不同字符
s4 = 'abc123' #将abc换成XYZ
s4.translate({ord('a'):'X',ord('b'):'Y',ord('c'):'Z'}) #'XYZ123'
s4.translate(s4.maketrans('abc','XYZ')) #'XYZ123' maketrans内两参数注意对其 可见下输出
s4.maketrans('abc','XYZ') # {97: 88, 98: 89, 99: 90}
s4 = 'abc123 \t '
s4.translate({ord(' '):'', ord('\t'):''}) #'abc123'