【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']=''
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':'','xiaoming':''}
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':'',
'dayu':'',
'momo':''
}
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':'','dayu':'','momo':''}
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=['','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','',3306)
print(t.count(3306)) #统计出现次数
print(t.index('')) #字符串有下标,但是字符串不能修改
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('','xiaoming')) #使用{}占位,与%s效果一致 s4='insert into stu(name,age,grass) values ("{name}","{age}","{grass}")'
s4=s4.format(name='min',age='',grass='')
print(s4)
#可以不按顺序对应,只要占位名称一样即可 print(s4.format_map({"username":"abc","id":"","password":""})) #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:\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():记录文件指针的当前位置
【2019-5-26】python:字典、常用字符串处理方法及文件操作的更多相关文章
- [转]C++常用字符串分割方法实例汇总
本文实例汇总了C++常用字符串分割方法,分享给大家供大家参考.具体分析如下: 我们在编程的时候经常会碰到字符串分割的问题,这里总结下,也方便我们以后查询使用. 一.用strtok函数进行字符串分割 原 ...
- C++常用字符串分割方法实例汇总
投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-10-08我要评论 这篇文章主要介绍了C++常用字符串分割方法实例汇总,包括了strtok函数.STL.Boost等常用 ...
- (数据科学学习手札131)pandas中的常用字符串处理方法总结
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在日常开展数据分析的过程中,我们经常需要对 ...
- python列表常用内建方法
python列表常用内建方法: abc = ['a',1,3,'a'] #abc.pop(1) #删除索引1的值.结果['a', 3] #abc.append([123]) #结果:['a', 1, ...
- 简学Python第二章__巧学数据结构文件操作
#cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...
- 3. Python 字典 常用办法总结
Python字典客储存任意类型的对象,如字符串.数字.元祖.列表.字典.bool等. 优点:取值方便,速度快 1.创建字典 字典由键(key)和对应值(value)成对组成. 字典也被称作关联数组或哈 ...
- python字典、字符串(json串)、字节串之间的转化
字典和json字符串(本质也是字符串)之间的转化用json.dumps和json.loads() json.dumps(): 字典→json字符串 json.loads(): json字符 ...
- Python编程-常用模块及方法
常用模块介绍 一.time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行 ...
- python 数据类型 之 字符串 拼接 方法 以及效率问题
在任何编程语言中,字符串的操作应该是最频繁的操作之一.在python中字符串的操作主要有以下几种方式.以及对效率的分析 字符串的拼接:字符串的拼接双方只能是字符串. 方法一: website = 'p ...
随机推荐
- 6-10 SVM支持向量机1
都是特征加上分类器.还将为大家介绍如何对这个数据进行训练.如何训练得到这样一组数据. 其实SVM支持向量机,它的本质仍然是一个分类器.既然是一个分类器,它就具有分类的功能.我们可以使用一条直线来完成分 ...
- 2.27 MapReduce Shuffle过程如何在Job中进行设置
一.shuffle过程 总的来说: *分区 partitioner *排序 sort *copy (用户无法干涉) 拷贝 *分组 group 可设置 *压缩 compress *combiner ma ...
- 任务37:生成 JWT Token
实现给用户办法token 默认是可以访问valuesController的,返回的状态是200 http://localhost:5429/api/values 返回的状态码是200 把ValuesC ...
- UVaLive 7457 Discrete Logarithm Problem (暴力)
题意:求一个x使得 a^x%p = b p为素数: 析:从1开始扫一下就好,扫到p-1就可以了,关键是这个题为什么要用文件尾结束,明明说是0,但是不写就WA... 代码如下: #pragma comm ...
- Codeforces277A 【dfs联通块】
题意: 给出n个人会的语言类型,然后问这n个人里面还需要几个人学习一下语言就可以n个直接互通了.a会1,2,b会2,3,c会4,那么只要C学一下1或者2,或者3就好了...大致就是这个意思. 思路: ...
- bzoj 1003: [ZJOI2006]物流运输【spfa+dp】
预处理出ans[i][j]为i到j时间的最短路,设f[i]为到i时间的最小代价,转移显然就是 f[i]=min(f[j-1]+ans[j][i]*(i-j+1)+k); #include<ios ...
- P1219 最优贸易
C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市. 任意两个城市之间最多只有一条道路直接相连. 这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的 ...
- AtCoder Grand Contest 013 E - Placing Squares
题目传送门:https://agc013.contest.atcoder.jp/tasks/agc013_e 题目大意: 给定一个长度为\(n\)的木板,木板上有\(m\)个标记点,距离木板左端点的距 ...
- EXBSGS
http://210.33.19.103/problem/2183 参考:https://blog.csdn.net/frods/article/details/67639410(里面代码好像不太对) ...
- hibernate Day2
Day21 实体类编写规则(1 ) 实体类中的属性是私有属性(2) 私有属性要生成get与set方法(3) 实体类中有属性作为唯一值(一般使用id值)(4) 实体类属性建议不要使用基本数据类型, 应当 ...