一、数据类型:字典

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:字典、常用字符串处理方法及文件操作的更多相关文章

  1. [转]C++常用字符串分割方法实例汇总

    本文实例汇总了C++常用字符串分割方法,分享给大家供大家参考.具体分析如下: 我们在编程的时候经常会碰到字符串分割的问题,这里总结下,也方便我们以后查询使用. 一.用strtok函数进行字符串分割 原 ...

  2. C++常用字符串分割方法实例汇总

    投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-10-08我要评论 这篇文章主要介绍了C++常用字符串分割方法实例汇总,包括了strtok函数.STL.Boost等常用 ...

  3. (数据科学学习手札131)pandas中的常用字符串处理方法总结

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在日常开展数据分析的过程中,我们经常需要对 ...

  4. python列表常用内建方法

    python列表常用内建方法: abc = ['a',1,3,'a'] #abc.pop(1) #删除索引1的值.结果['a', 3] #abc.append([123]) #结果:['a', 1, ...

  5. 简学Python第二章__巧学数据结构文件操作

    #cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...

  6. 3. Python 字典 常用办法总结

    Python字典客储存任意类型的对象,如字符串.数字.元祖.列表.字典.bool等. 优点:取值方便,速度快 1.创建字典 字典由键(key)和对应值(value)成对组成. 字典也被称作关联数组或哈 ...

  7. python字典、字符串(json串)、字节串之间的转化

    字典和json字符串(本质也是字符串)之间的转化用json.dumps和json.loads() json.dumps():   字典→json字符串 json.loads():     json字符 ...

  8. Python编程-常用模块及方法

    常用模块介绍 一.time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行 ...

  9. python 数据类型 之 字符串 拼接 方法 以及效率问题

    在任何编程语言中,字符串的操作应该是最频繁的操作之一.在python中字符串的操作主要有以下几种方式.以及对效率的分析 字符串的拼接:字符串的拼接双方只能是字符串. 方法一: website = 'p ...

随机推荐

  1. ecb-2.40与cedet-1.1的兼容(转载)

    转自:http://blog.csdn.net/cnsword/article/details/7474119 今天凑热闹把fedora升级到了17,emacs升级到了24,但是悲剧了,显示cedet ...

  2. ASP.NET Core Web API + Angular 仿B站(一) 目的分析以及创建 WebAPI + Angular7 项目

    前言: 本系列文章主要为对所学 Angular 框架的一次微小的实践,对 b站页面作简单的模仿. 本系列文章主要参考资料: 微软文档: https://docs.microsoft.com/zh-cn ...

  3. C++笔试题(三)

    普天是南京一家通信公司,全称为:南京普天通信股份有限公司,公司网址为:http://www.postel.com.cn 网上流传一套普天C++笔试题,我将我做的答案公布与此,仅供参考. 1.实现双向链 ...

  4. Codeforces645B【树状数组求逆序数】

    题意: 给你1-n的序列,然后有k次机会的操作,每一次你可以选择两个数交换. 求一个最大的逆序数. 思路: 感觉就是最后一个和第一个交换,然后往中间逼近,到最终的序列,用树状数组求一下逆序数. #in ...

  5. 骨骼蒙皮动画(SkinnedMesh)的原理解析(一)

    http://blog.csdn.net/jimoshuicao/article/details/9253999 一)3D模型动画基本原理和分类 3D模型动画的基本原理是让模型中各顶点的位置随时间变化 ...

  6. IT兄弟连 JavaWeb教程 经典面试题3

    1.简述什么是重定向? 服务器向浏览器发送—个302状态码及一个Location消息头(该消息头的值是一个地址,称之为重定向地址),浏览器收到后会立即向重定向地址发出请求. 2.简述什么是转发?怎么实 ...

  7. Educational Codeforces Round 24 A

    There are n students who have taken part in an olympiad. Now it's time to award the students. Some o ...

  8. 关于bootstrap table的server分页

    首先是bootstrap初始化的表格参数: // 初始化Table oTableInit.Init = function() { $('#booksTable').bootstrapTable({ u ...

  9. G. 24 观察 + 树状数组

    http://codeforces.com/gym/101257/problem/G 首先要看到题目,题目是本来严格大于score[i] > score[j].然后score[i] < s ...

  10. PHP pack和unpack函数详解

    pack 压缩资料到位字符串之中. 语法: string pack(string format, mixed [args]...); 返回值: 字符串 函数种类: 资料处理 内容说明 本函数用来将资料 ...