一、数据类型:字典
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)) #结果是字符串
三、字符串的常用方法:
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() #不输按空格分隔字符串 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 中的每个元素,通过指定的字符串连接起来,这个例子是通过逗号连接的
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:\Users\94596\Desktop\abc.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('\n下周不上课')
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+'\n') 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:\Users\94596\Desktop\access.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():记录文件指针的当前位置