Python实例(二)

如何拆分含有多个分割符的字符串

方案一:连续使用str.split()方法,每次处理一种分割符
方案二:使用正则表达式的re.split()方法,一次性拆分字符串


s.split()
##s为字符串,第一个参数是分割符,如果为空白则表示空格,换行等,特点是速度快

##方案一,编写自己的处理函数,s为传入的字符串,ds是分割符字符串
def mySplit(s,ds):
    res=[s]
    for d in ds:
        t=[]
        map(lambda x:t.extend(x.split(d)),res)
        res=t
    return [x for x in res if x] 

##方案二:
import re
re.split()
##第一个参数是正则表达式,第二个是字符串
s.split(r'[,;\t]+',s)
##[]表示即里面的任意字符,+表示一个或者多个

如何判断字符串a是否以字符串b开头或结尾

方案:使用字符串的str.startwith()和str.endswith()方法,注意多个匹配时参数使用元组

s='g.sh'
s.endswith('.sh')
>>True
s.endswith('.py')
>>False
s.endswith(('.sh','.py'))
>>True##只需一个匹配即可

如何调整字符串中文本的格式

问题:想把日期改为美国日期格式’mm/dd/yyyy’,如‘2016-05-23’变为‘05/23/2016’
方案:使用正则表达式re.sub()方法做字符串的替换,利用正则表达式的捕获组,捕获每个部分内容,在替换字符串中调整各个捕获组的顺序

##log为一段包含日期信息的文本
re.sub('(\d{4})-(\d{2})-(\d{2})',r'\2/\3/\1',log)
##其中正则表达式里()表示捕获组,并且默认序号是从左到右123依次排序

##我们也可以命名捕获组
re.sub('(?p<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})',r'\g<month>/\g<day>/\g<year>',log)

如何将多个字符串拼接成一个大的字符串

方案一:迭代列表,连续使用多个’+’操作依次拼接每一个字符串
方案二:使用str.join()方法,更加快速的拼接列表中所有字符串

##方案一:大量的字符串拷贝释放,耗性能,不适合长字符串
##pl是多个字符串列表
s=''
for p in pl:
    s+=p


##方案二:不存在临时变量的浪费
''.join(pl)
##如果pl中包含数字,使用生成器表达式,作为参数不需要()
''.join(str(x) for x in l)

如何对字符串进行左右居中对齐?

方案一:使用字符串的str.ljust(),str.rjust(),str.center()进行左右居中对齐
方案二:使用format()方法,传递类似’<20’,’>20’,’^20’参数完成同样任务

s='abc'
##参数依次为宽度或字符串长度,对空值的填充字符
s.ljust(20,'=')
>'abc===================='

##方案二:
format(s,'<20')
##<为左对齐,>右对齐,^居中对齐,20为宽度

##字典的格式化输出
w=max(map(len,d.keys()))
for k in d:
    print(k.ljust(w),':',d[k])

如何去掉字符串中不需要的字符

问题:windows下编辑文本中的换行符为’\r\n’,但在linux下为’\n’,因此文本放到linux下需要去掉’\r’
方案一:字符串strip(),lstrip(),rstrip()方法去掉字符串两端字符
方案二:删除单个固定位置的字符,可以使用切片+拼接的方式
方案三:字符串的replace()方法或正则表达式re.sub()删除任意位置字符
方案四:字符串translate()方法,可以同时删除多种不同字符


s='   abc  123   '##方案一
s.strip()
>'abc  123'
s.lstrip()
>'abc  123   '
s.rstrip()
>'   abc  123'

s='---abc+++'
s.strip('-+')
>'abc'

##方案二:
s='abc:123'
s[:3]+s[4:]
>'abc123'

##方案三:
s='\tabc\t123\txyz'
s.replace('\t','')
>'abc123xyz'

##方案三:
s='\tabc\t123\txyz\ropq\r'
re.sub('[\t\r]','',s)
>'abc123xyz'

##方案四:
##str.translate() 和 unicode.translate()不同

s='abc123xyz'
import string
string.maketrans('abcxyz','xyzabc')## 得到一个映射表
s.translate(string.maketrans('abcxyz','xyzabc'))
>'xyz123abc'

##str.translate()第一个参数是映射表,第二个参数指定要删除的字符
s='abc\rxyz\n123\t'
s.translate(None,'\t\r\n')
>'abcxyz123'

##删除unicode字符,例如
u.translate({0x0301:None})

如何读写文本文件

  • python.2x:
    要unicode的字符串编码成可存储的string,读取文件时要解码成为unicode

    在Python2中,有两种字符串格式,str和unicode,str表面上是字符串,实际上是一串连续的字节,早期设计的编码如ascII码是一个字节等于一个字符,因此一串连续的字节就等于字符串。后期为了表示各国的文字,则发明了其他编码格式如unicode,python内部就是使用unicode编码来表示一个字符,因此unicode才是真正意义上的字符串。但unicode编码的字符不能直接存储到文件当中,必须以某种编码格式变成连续字节的形式才能储存,如utf8,gbk等

  • python.3x:
    open函数指定‘t’为文本模式,endcoding指定编码格式
    原来的str变成一系列的字节,字符串统一使用unicode编码

##unicode和string转化
s=u"你好"
s.encode('utf8')##对unicode字符串进行编码
>'\xe4\xbd\xa0\xe5\xa5\xbd' ##得到一个6个字节的str字符串,才能存储到文件当中
s.encode('gbk')
>'\xc4\xe3\xba\xc3' ##4个字节
##编解码必须用相同的编码,否则会乱码

##python2文本文件的读写
open ('py2.txt','w')
s=u"你好"
f.write(s.encode('gbk'))##将unicode以gbk编码为str进行存储
f.close()

open ('py2.txt','r')
t=f.read()
t.decode('gbk')

##python3的文本读写
b‘fdfdfe'  ## 在Py3中要加b表示字节字符串,但Py2不用
'你好'     ## Py3中unicode编码的字符串不用加u,在Py2需要
f = open('py3.txt','wt',encoding='utf8') ##t是默认模式
f.write('你好') ##我们可以直接写unicode字符串
f.close()

f = open('py3.txt','rt',encoding='utf8')##读取文件
s=f.read()

如何处理二进制文件

案例:wav是一种音频文件格式,是二进制文件,前44个字节为头部信息,后面是音频采样信息。

struct模块中最主要的三个函数式pack()、unpack()、calcsize()。
pack(fmt, v1, v2, …) —— 根据所给的fmt描述的格式将值v1,v2,…转换为一个字符串。
unpack(fmt, bytes) —— 根据所给的fmt描述的格式将bytes反向解析出来,返回一个元组。
calcsize(fmt) —— 根据所给的fmt描述的格式返回该结构的大小。

FormatC TypePython字节数
xpad byteno value1
ccharbytes of length1
bsigned charinteger1
Bunsigned charinteger1
_Boolbool1
hshortinteger2
Hunsigned shortinteger2
iintinteger4
Iunsigned intinteger4
llonginteger4
Lunsigned longinteger4
qlong longinteger8
Qunsigned longinteger8
ffloatfloat4
ddoublefloat8
schar[]bytes1
pchar[]bytes1
Pvoid *integer

解决方法:
open函数想以二进制模式打开文件,指定mode参数为‘b’
二进制数据可以用readinto,读入到提前分配好的buffer中,便于数据处理
解析二进制数据可以使用标准库中的struct模块中的unpack方法

f=open('demo.wav','rb'
info=f.read(44)
import struct
struct.unpack('h','\x01\x02')
>(513,)
##两个参数,第一个是把后面参数字符串解析成哪种c语言的数据类型

struct.unpack('h',info[22:24}) ##解析22到24字节的信息
import array ##将采样信息读入到数组中
f.seek(0,2)  ##将指针移到文件的末尾处
f.tell() ##报告文件的指针,即文件字节数,文件长度
n=(f.tell()-44)/2 ##数组长度
buf = array.array('h',(o for _in range(n)) ##第一个参数指定数据类型,后面是初始化数组的迭代器
f.seek(44) ##将指针返回采样信息头部
f.readinto(buf) ## 把文件的数据读入到buf当中

for i in range(n):buf[i]/=8 ##将声音变小
f2=open('demo2.wav','wb') 
f2.write(info)
buf.tofile(f2)##将buf写入文件
f2.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值