【2019-5-26】python:字典、元组、常用字符串处理方法及文件操作

一、数据类型:字典

1.字典:

1.1定义字典:dict={'key':'value'}

1.2字典与列表相比,字典取值快,可直接找到key

1.3字典是无序的,不能根据顺序取值

1.4多个元素用逗号隔开,key名称不能重复,如:

info={'name':'momo','sex':'','addr':'beijing'}

2.字典的增删改查

2.1增加:

#直接增加:
info['qq']='454545454'
print(info)
#setdefault('a','b')增加
info.setdefault('car','bmw')
print(info)

2.1.1两种增加方式的区别:

增加字典中不存在的key时,两种方式无区别;

增加字典中已经存在的key时:

#setdefault kay重复的话就不修改,kay不存在就增加一个

#info[qq]:1000,依据key改值

3.删除:删除指定的key,以下两种方式无区别

info.pop('qq')
del info['qq']
#随机删除(不常用)
#info.popitem()

4.取值:

#多种方式
print(info['qq'])   #此种方式,当字典中不存在这个key时会报错
print(info.get'phone')
#.get的方式,当字典中不存在这个key,会返回none,不会报错,安全起见,取值时,使用.get的方式

print(info.get('favourite','cooking')
#获取key是favourite的值,如果有就返回对应的值,如果没有就返回cooking
print(info.keys())  #获取info这个字典中的所有key的名称
print(info.values())#获取info这个字典中的所有value的名

5.字典的其他操作

5.1清空列表:info.clear()

5.2拼接两个字典:info.update()

stu={'xiaohong':'18','xiaoming':'20'}        
print(info.update(stu))
#把stu拼接到info字典下

5.3判断key是否存在:

print('phont' in info )
#如果存在的话,返回True,不存在的话返回Falus

6.多层字典取值:

stu_info  = {
    'liudonghai':{
        'house':['三环','四环','五环'],
        'car':{
            'china':['byd','五菱宏光','Hongqi'],
            'jap':['丰田','本田'],
            'Genmany':{
                'ben-z':2,
                'bmw':3,
                'audi':5
            }
        }
    }
}
#刘东海又买了一辆宝马
stu_info['liudonghai']['car']['Genmany']['bmw']+=1
print(stu_info)
#刘东海扔了比亚迪
stu_info['liudonghai']['car']['china'].remove('byd')
print(stu_info)

7.字典练习:

注册程序:

(1)输入账号密码

(2)如果密码不存在,可以注册

(3)存在的话提示账号已存在

register={
    'tuzi':'123456',
    'dayu':'111111',
    'momo':'456789'
}
for i in range(3):
    N = input('请输入用户名')
    P = input('请输入密码')
    if N not in register:
        print('可以注册')
        register.setdefault(N,P)
        break
    else:
        print('用户名已存在')
        continue
print(register)

8.字典循环:以下两种方法,第二种方法比第一种方法好

#第一种方法:
accounts={'tuzi':'123456','dayu':'111111','momo':'456789'}
for i in accounts:
    print('%s:%s'%(i,accounts[k]))

#第二种方法:
for k,v in accounts.items():
    print(k,v)

dict_items([('tuzi', '123456'), ('dayu', '111111'), ('momo', '456789')])

item():Python 字典(Dictionary) items() 函数以列表返回可遍历的(键, 值) 元组数组。

dict_items([('tuzi', '123456'), ('dayu', '111111'), ('momo', '456789')])

9.把两个字符串拼成字典:

list1=['uid','name','sex']
list2=['001','yuanxin','']

print(dict(zip(list1,list2)))
同下:
dict={}
for i in range(len(list1)):
    dict[str(list1[i])]=str(list2[i])
print(dict)

二、数据类型:元组tuple。

1.元组定义:

元组也是一个list,但是元组不能修改和增加,只能取值

t=(1,2,3,4,5)      #元组也通过下标取值
print(t[0])

#t[0]='a' 结果报错,元组不能修改

2.count():统计元素出现次数

t=('172.16.108.228','root','123456',3306)
print(t.count(3306))   #统计出现次数
print(t.index('123456'))

#字符串有下标,但是字符串不能修改
s='abcdef'
print(s[0])
jieguo

3.元组中只有一个元素时,要在元素后边加逗号

#元组中只有一个元素时,要在元素后边加一个逗号,
t1=(1)
print(type(t1))     #结果是int型
t3=(1,)             #元素中只有一个元素时,要在元素后边加一个逗号,
t2=('a')
print(type(t2))         #结果是字符串

4.删除元组:

已经创建的元组,不再使用时,可以用del语句将其删除

del tuplename

三、字符串的常用方法:

s=' abc   '
print(s.strip())      # 去掉字符串左右两边的空格和换行符,在字符串中间的无法取掉
print(s.rstrip())     #只去右边的空格
print(s.lstrip())     #只去左边的空格
print(s.replace('a','A'))  #replace()替换,把a替换成成A
print(s.replace(' ',''))            #去掉中间空格,把空格替换成空字符串
#所有字符串方法,都是返回一个新的字符串,不会修改原来的字符串,因为字符串无法修改


s2='abc'
s2.index('c')   #查找c的下标
s2.count('c')  #统计c出现的次数
s2.startswith('a')  #判断是否是以a开头,是返回True,不是返回false
s2.endswith('.jpg')  #判断是否以d结尾,是返回True,不是返回false
s2.find('d')         #判断字符串中是否有'd'

s2.upper()   #将字符串转换成大写
s2.lower()     #将字符串转换成小写
s2.isdigit()      #判断是否是整数,是返回True,不是False,是整数可以转成int类型
print(s.capitalize())         #首字母大写
print(s.center(50,'='))           #总长度设为50,不够50用某字符在两侧补齐
s2='1A'
s2.zfill(9)  #不足9位前边补0,python不能写num=01这种,所以需要写001,只能定义字#符串,然后补零
s2.isupper()   #判断是否首字母大写
s2.islower()  #判断是否首字母小写
s2.isalpha()    #判断是否都是汉字和字母
s2.isalnum()   #判断是否都是子母和数字
s2.issplace()     #判断是否都是空格

s3='今天是{},欢迎{}登陆'
print(s3.format('2019','xiaoming'))     #使用{}占位,与%s效果一致

s4='insert into stu(name,age,grass) values ("{name}","{age}","{grass}")'
s4=s4.format(name='min',age='18',grass='9')
print(s4)
 #可以不按顺序对应,只要占位名称一样即可

print(s4.format_map({"username":"abc","id":"1","password":"123456"}))    #format_map():可以写字典
stus='xiaoming,xiaohei,xiaobai,xiaojun'

#分割字符串:.split()  按xxx分割字符串,默认是按空格分隔
stus.split(',')   #按逗号分隔字符串你
stus.split()      #不输按空格分隔字符串
stu.split(',',4) #用逗号分隔并且只分割前四个 students='xiaoming xiaohei xiaobai xiaojun' students.split(',') #没有可分割的就输出全部字符串

#字符串分割后取值:
这是个很好的例子!!!!!!!!
>>> str="hello boy<[www.doiido.com]>byebye" >>> str.split("[")[1].split("]")[0] 'www.doiido.com' >>> str.split("[")[1].split("]")[0].split(".") ['www', 'doiido', 'com']
 

数据库中只能存字符串,不能存list和字典,所以需要存入list中元素进数据库时,要先将元素都转化成字符串类型

list=['xiaoming''maomao','xiaomei','dongdong']
a=','.join(list)
#把list 中的每个元素,通过指定的字符串连接起来,这个例子是通过逗号连接的

使用字符串对象的format()方法:

 

 练习:

#>右对齐,长度为5,不足5用0补齐,类型是s字符串类型
s='{:0>5s}你好,我是{:s}'
s1=s.format('小白','韩寒')
print(s1)
# 通过key来填充字符串
s2='{name1} hello,i am {name2}'
s3=s2.format(name1='xiaobai',name2='xiaoming')
print(s3)
#保留两位小数
s4=3.141592653
num='{:.2f}'.format(s4)
print(num)

print和pprint的区别:

import pprint
l=['xiaoming', 'xiaohei', 'xiaobai', 'jaojun']
print(''.join(l))    #把list 中的每个元素,通过指定的字符串连接起来
sl=str(l)
pprint.pprint(l)
pprint.pprint(sl)
print(l)
print(type(sl))

 三、文件处理

1.文件读写

1.1操作文件的过程:打开、操作、关闭

#操作文件:打开、操作、关闭
#打开文件的模式:读模式r 、写模式 w、追加模式 a
#读模式:只能读不能写,打开不存在文件会报错
f=open('笔记',encoding='utf-8')              #打开在pycharm中创建的文件
result =f.read()
print(result)
#写模式,只能写不能读。写之前会先清空,再写入
s=open('test','w',encoding='utf-8')        #如果要写入的话,需要写模式 ,写模式如果文件不存在会建一个新文件,如果文件有内容,会覆盖
s.write('abc')
result=s.read()
print(result)

#追加模式,a:在原文件末尾增加新内容,文件不存在可以创建,但是只能写不可读
a=open('not','a',encoding='utf-8')
a.write('haha')
# result=a.read()
# print(result)

1.2打开文件模式1:读模式(r),写模式(w),追加模式(a)


#操作文件:打开、操作、关闭
#打开文件的模式:读模式r 、写模式 w、追加模式 a
#读模式:只能读不能写,打开不存在文件会报错
f=open('笔记',encoding='utf-8') #打开在pycharm中创建的文件
result =f.read()
print(result)
#写模式,只能写不能读。写之前会先清空,再写入
s=open('test','w',encoding='utf-8') #如果要写入的话,需要写模式 ,写模式如果文件不存在会建一个新文件,如果文件有内容,会覆盖
s.write('abc')
result=s.read()
print(result)

#追加模式,a:在原文件末尾增加新内容,文件不存在可以创建,但是只能写不可读
a=open('not','a',encoding='utf-8')
a.write('haha')
# result=a.read()
# print(result)
 

1.3打开文件模式2:读写模式r+,写读模式:w+,追加读模式:a+


r+   读写模式、w+  写读模式、a+   追加读模式
r+ 打开不存在文件会报错,只要跟r有关的,都不能打开不存在的文件
f=open('test',"r+",encoding='utf-8')
f.write('bbbbbbb')
result=f.read()
print(result)
w+:只要和w模式有关,都会先清空,未移动指针前读不到内容
w=open('w','w+',encoding='utf-8')
w.write('xiedu')
result=w.read()
print(result)

a+:能写能读,但是读前要移动指针,由于a+模式是在内容后面追加,不会清空原内容,所以使用时尽量使用a+模式
a=open('a','a+',encoding='utf-8')
a.write('xiedu')
result=a.read()
print(result)
 

2.文件读写2

f2=open(r'C:Users94596Desktopabc.txt',encoding='utf-8')
print(f.readline())      #每次读取一行的内容,调一次读一次
print('lines',f.readlines)    #将文件中每行的内容都返回到一个list中,
print('read',f.read())                  #readlines后再读读不出内容,因为文件指针已经在最后
#移动指针:
f.seek(0)                                  #移动指针,0是最前面
print('read',f.read())    #这时再读就可以读出来内容了

3.文件指针:

刚打开文件的时候 ,文件指针在最前面,执行完read()后,文件指针移动到最后边,所以读不出内容来

f=open('test','w+',encoding='utf-8')
f.write(' 下周不上课')
f.seek(0)
print(f.read())

#a+文件指针是在最后边,seek(0)先清空,再read
#保险起见,又能读有能写,用a+

r+,文件指针在最前面,用r+写入,会代替开头的内容

4.把list的内容循环写到文件中:writelines()

list=['a','b','c','d']
f3=open('hm','w',encoding='utf-8')
for i in list:
    f3.write(i+'
')
print(f3)
#实现以上功能的方法:
f3.writelines(list)
 #传一个list的话,会自动循环,把list里面每个元素写到文件里

3.文件修改:

3.1文件修改的原理:

3.1.1.简单方式:

#先读取内容,再替换
#清楚原文件内容,写进新内容

f=open('test','a+',encoding='utf-8')   #a+模式进入文件,指针是在文件最后边
f.seek(0)      #文件指针移到最前边
result=f.read()      #先读取文件再替换
content=result.replace('xiaohong','dalan')  #把test文件中的xiaohong替换成dalan
f.seek(0)
f.truncate        #清空原文件
f.write(content)        #把content写进原文件

3.2.2 逐行处理

f1=open('test','a+',encoding='utf-8')
f2=open('test2.txt','a+',encoding='utf-8')
f1.seek(0)        #因为是a+模式,需要从第一行开始取,所以把指针移到最前面,但是如果是只读模式,默认指针是在最前面的,不需要seek(0)
for line in f1:
    result=line.upper()   #读取每一行,并修改
    f2.write(result)          #将修改后的结果,逐行放在f2文件中
f1.close()
f2.close()
os.remove('test')                 #删掉修改前的文件
os.rename('test2.txt','test')             #把修改后的文件重命名

 4.高效处理文件:

f=open(r'test',encoding='utf-8')
for line in f:
    print(line)                  #每次读取一行

5.不用关闭文件的方式:

with open('test')as f,open('hm','w') as f2:          #with自动判断程序执行完,就自动关闭,不需要.close(),两个文件用逗号隔开,只需要写一个with
    f=f.read()
    f2.write('XX')

 6.练习监控日志:

每分钟读取一次文件,把1分钟内访问数量超过100的ip取出来,禁掉

#写一个死循环
import time
point=0
while True:                                     #死循环,for不能写死循环
    ips={}          #存放所有的ip
    f=open(r'C:Users94596Desktopaccess.log',encoding='utf-8')
    f.seek(point)
    for line in f.readlines():
        if line.strip()!='':
            ip=line.split()[0]
            if ip not in ips:
                ips.setdefault(ip,1)
            else:
                ips[ip]+=1
    point=f.tell()           #记录文件指针的当前位置
    for k,v in ips.items():
        if v>=100:
            print('有问题的ip:%s'%k)
    f.close()
    time.sleep(60)                    #每分钟运行一次

 f.tell():记录文件指针的当前位置

原文地址:https://www.cnblogs.com/hancece/p/10933084.html