从零开始学Python-day4
Python--Day4学习要有定位,明确目标地去学习。希望自己能坚持下去,并有所收获---leaves
大体上,开发的主要思想就是增、删、改、查四大部分。---Panda
python03-列表、字典和字符串进阶以及文件操作
一、列表的去重
列表去重的方法主要有set集合和函数两种方法去重。
方案一:set集合
>>> name_list = ['haha', 'heheh', 'haha', 'euw', 'liwei.fu']
>>> set(name_list)
set(['euw', 'liwei.fu', 'haha', 'heheh'])
方案二:函数
>>> name_list = ['haha', 'heheh', 'haha', 'euw', 'liwei.fu']
set(['euw', 'liwei.fu', 'haha', 'heheh'])
>>> new_list = []
>>> for i in name_list :
... if i not in new_list:
... new_list.append(i)
>>> new_list
二、列表和字符串之间的转换
字符串 ====>列表 split()
列表====>字符串 join()
##join() ==》格式为 "连接符".join(name_list)
###join()和split()详解
##split()举例用法
In : ip = "192.168.1.1"
In : ip.split(".")
Out: ['192', '168', '1', '1']
##join()举例用法
In : '!'.join(['192', '168', '1', '1'])
Out: '192!168!1!1'
小例子:将192.168.1.1-255的ip存入到列表中===>对应实例为公司将机房ip存入数据库
In : ip_arr = []
In : netip = "192.168.1."
In : for i in range(1,5):
...: ip = netip+"".join(str(i))
...: ip_arr.append(ip)
...: print ip_arr
...:
...:
...:
['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4']
三、列表的进阶
列表的高级用法:列表的遍历
3.1 普通的列表遍历
In : shoplist = list('test')
In : for i in shoplist:
...: print i
...:
t
e
s
t
3.2 列表的高级遍历 && 列表生成式
列表的高级遍历主要需求是:希望列表中的元素对应其index索引值
In : shoplist = ['c','a','b','a']
In : for index,value in enumerate(shoplist):
...: print index , value
...:
0 c
1 a
2 b
3 a
列表生成式:主要将字典data的key,value分别取出来做成列表
格式:
需求:一、字符串拼成列表
二、列表本身拼接成列表
三、字典拼接成列表
##练习:将字符串生成列表===>需求一、字符串拼成列表
In :
Out: ['a', 'b', 'c', 'x']
##练习,列表本身拼成列表===>需求二、列表拼成列表
In : arr =
In :
Out:
##上述列表生成式的原生态写法
In : arr =
In : new_a = []
In : for i in arr:
...: if i > 20:
...: new_a.append(i)
...: print new_a
...:
##练习:将字典生成列表===>需求三、字符串拼成列表
#方法一
In : fields = ['a','b','c']
In : data = {'a':'abc','b':'bac','c':'cab'}
In : for x in fields]
Out: ['abc', 'bac', 'cab']
##方法二
In :
Out: ['abc', 'cab', 'bac']
3.3 列表的高级用法
列表可以用来优雅的拼接mysql语句====>mysql语句的拼接
#传统SQL语句,死板,更改的话不方便
In : sql = "select> In : sql
Out: 'select> #进阶拼接,更改fields列表就能拼接获取自己想要的数据
#通过列表动态拼接MySQL
fields = ['id','username','email','role']
sql = "select%s from users" %",".join(fields)
In : sql = ''
In : sql = 'select %s from users' % ','.join(fields)
In : sql
Out: 'select> 四、字典基础知识
4.1 字典可以嵌套任意数据类型 && 字典的增删改查
##字典可以嵌套任意数据类型(key值必须唯一)
In : content = {'name':'test','black':{'phone':11111,'age':22},'colo':[ '22222',33]}
In : content
Out: {'black': {'age': 22, 'phone': 11111}, 'colo': ['22222', 33], 'name': 'test'}
#查找key值
In : content.keys()
Out: ['colo', 'black', 'name']
##增加值
In : content['aa']='ceshi'
In : content
Out:
{'aa': 'ceshi',
'black': {'age': 22, 'phone': 11111},
'colo': ['22222', 33],
'name': 'test'}
##删除字典值===>字典是无序的不能直接pop(),必须指定值
In : content.pop('aa')==>dict.pop(key) 指定key值
Out: 'ceshi'
In : content
Out: {'black': {'age': 22, 'phone': 11111}, 'colo': ['22222', 33], 'name': 'test'}
##修改值
In : content
Out: {'black': {'age': 22, 'phone': 11111}, 'colo': ['22222', 33], 'name': 'test'}
##第一种
In : content['name']='xiugai'
#第二种,字典嵌套列表
In : content['colo']= 60
#第三种,字典嵌套字典
In : content['black']['phone'] = 99999
#修改完成后的结果
In : content
Out: {'black': {'age': 22, 'phone': 99999}, 'colo': ['22222', 60], 'name': 'xiugai'}
#字典的查==>属性的查找和内容的查找
##len(dict)举例查找字典的长度
In : d = {'a':'b','c':'d'}
In : len(d)
Out: 2
###查字典的keys值
In : content.keys()
Out: ['colo', 'black', 'name']==>以列表的形式返回
##查字典的values值
In : content.values()
Out: [['22222', 60], {'age': 22, 'phone': 99999}, 'xiugai']=>以列表的形式返回
###查字典的键值对
In : content.items()
Out:
[('colo', ['22222', 60]),
('black', {'age': 22, 'phone': 99999}),
('name', 'xiugai')]===>以列表的形式返回
4.2 字典高阶查找介绍
4.2.1 查找key是否存在
In : content
Out: {'black': {'age': 22, 'phone': 99999}, 'colo': ['22222', 60], 'name': 'xiugai'}
In : content.has_key('black')
Out: True
In : content.has_key('ssss')
Out: False
4.2.2 高阶字典的取值dict.get()进阶
具体例子:若取字典中不存在的key的value值时,会报错并终止程序。
In : content['sss']
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
in ()
----> 1 content['sss']
KeyError: 'sss'===>在开发中如果key不存在的话会终止程序。改进
改进如下:
In : content.get('asss','None')
Out: 'None'
In : content.get('name','None')
Out: 'xiugai'
dict.get()进阶
In : res = content.get('aaaaa','None')
In : res
Out: 'None'
In : not res
Out: False
In : if res :
...: print “True”
...: else:
...: print "False"
...:
True
4.2.3 高阶字典的赋值dict.setdefault('KEY','VALUE')
####setdefault()函数小练习
In : d = {'a':'b','c':'d'}
In : d.setdefault('a','cc')
Out: 'b'
In : d.setdefault('f','cc')
Out: 'cc'
In : d
Out: {'a': 'b', 'c': 'd', 'f': 'cc'}
4.3 详细获取字典中value值中嵌套的数据:
**====>用isinstance([],list) 来判断是否为列表类型或者type([]) is list【is 结合type使用】
In : content
Out: {'black': {'age': 22, 'phone': 99999}, 'colo': ['22222', 60], 'name': 'xiugai'}
In : for k ,v in content.items():
...: print '%s: ----------' %k
...: if isinstance(v,dict):
...: for i ,j in v.items():
...: print i ,j
...: elif type(v) is list :
...: for x in :
...: print x
...: print v
...:
colo: ----------
22222
60
['22222', 60]
black: ----------
phone 99999
age 22
{'phone': 99999, 'age': 22}
name: ----------
xiugai
####判断是否为字符串str,生产中isinstence使用的多
In : res = isinstance("hello",str)
In : res
Out: True
4.4 字典生成式:字典的高级用法(可以快速翻转字典)
格式:
dict( (v,k)for k ,v in d.iteritems())
dict([(v,k)for k ,v in d.iteritems() ] )
###字典生成式小例子
In : d = {1:2,3:4,5:6,7:8}
In : print dict( (k ,v) for k ,v in d.iteritems())
{1: 2, 3: 4, 5: 6, 7: 8}
In : print dict( (v ,k) for k ,v in d.iteritems())
{8: 7, 2: 1, 4: 3, 6: 5}
说明:
1.在Python2.6或更早的版本,字典生成器可以接受迭代的键/值对:
d = dict((key,value) for (key,value) in iterable)#第一个key,value的()必须写,第二个可以不写
2.从Python2.7或者3以后,可以直接用字典推导式语法:
d = { key:valuefor (key,value) in interable} #key,value的()可以不写
##python2.6版本
In : print dict( (v ,k) for k ,v in d.iteritems())
{8: 7, 2: 1, 4: 3, 6: 5}
#python2.7及其以上版本
In : {v : k for k ,v in d.items()}
Out: {2: 1, 4: 3, 6: 5, 8: 7}
##拼接的高阶用法===>生产环境中查询多条数据返回的结果
In : res = [{'id':1,'name':'wd','age':18},{'id':2,'name':'test','age':2
...: 8}]
In : dict((str(x['id']),x['name']) for x in res)
Out: {'1': 'wd', '2': 'test'}
4.5 字典小例子:
4.5.1 将字符串中每个出现的单子个数统计出来
The cafeteria was noisy , but silence hung between us . Valeri didn't seem to mind , but it drove me crazy . I searched my mind for things to say .
####具体代码如下:
In : sentence = "I am Bob ! I am a boy ."
In : arr = sentence.split(" ")
In : res_dict = {}
In : for i in arr:
...: res_dict = res_dict.get(i,0) + 1===>高阶代码,可以省略四行代码
###统计出来单词及其对应的个数
In : res_dict
Out: {'!': 1, '.': 1, 'Bob': 1, 'I': 2, 'a': 1, 'am': 2, 'boy': 1}
4.5.2 字典的翻转:以个数为key,单词为value来转反成为新的字典(注意此时key重复的情况)
###具体代码如下:
In : new = {}
In : for k ,v in res_dict.items():
...: if v not in new.keys():
...: new =
...: else :
...: new.append(k)
In : print new
{1: ['!', 'a', 'boy', '.', 'Bob'], 2: ['I', 'am']}
###使用setdefault()函数优化代码
In : for k ,v in res_dict.items():
...: new.setdefault(v,[])
...: new.append(k)
...:
In : new
Out: {1: ['!', 'a', 'boy', '.', 'Bob'], 2: ['I', 'am']}
五、字符串的基础知识
In : name = "hello"
In : name.startswith('h')
Out: True
In : name.startswith('H')
Out: False
##字符串的格式化 C的风格和 C#风格
In : print "hello %s " % "xx"##C风格
hello xx
In : print "hello {}" .format("wd")###C#风格
hello wd
In : print "hello {1} {0}" .format("How are you","wd")###C#风格的优势可以更改格式化的顺序
hello wd How are you
列表的格式化:
list = ['hello', '1', '7']
'%s%d-%d' % ('hello', 1, 7)
'%s%s-%s' % (list,list,list)
高逼格:推荐生产中使用
'%s'%' ' .join(list)
字典的格式化:
In : d = {'name':'aa' ,'age':13}
In : "i am %(name)s ,my age is %(age)s" %(d)
Out: 'i am aa ,my age is 13'
In : "i am {name} ,my age is {age}" .format(**d) ##字典两个*号,列表一个*
Out: 'i am aa ,my age is 13'
####strip函数===>主要用于查找以.py等特定后缀结尾的文件名
In : st = " aa "
In : st.lstrip()
Out: 'aa '
In : st.rstrip()
Out: ' aa'
In : st.strip()
Out: 'aa'
##查找以.py等特定后缀结尾的文件名
In : a = 'test.py'
In : a.rstrip(".py")
Out: 'test'
5.1小练习:##查找以.py等特定后缀结尾的文件名
In : result = []
In : for filename in os.listdir('/usr/local/src/python/03'):
...: if filename.endswith(".py"):
...: result.append(filename.rstrip('.py'))
...: print result
['dict_turn', '01']
六、文件的操作
文件打开分为三步: 打开文件==>读文件==>关闭文件
文件的主要内容也是增删改查
In : f = open('/usr/local/src/python/03/01.py')
In : f.read()
Out: "l = ['hello',1,3]\nprint ','.join(l)\n"
In : f.close()
###运维的职责主要是读文件筛查日志
###增加 write新增一行
###writelines 新增多行
##查 readreadlines
###字符串、列表、字典文件的相互转换
6.1 文件打开的两种方式
方法一:f = open() 这种方法必须关闭文件,否则会报错
方法二:with open() as f: 这个方法代码简洁。会自行关闭文件
###代码举例
###方法一代码举例
In : f = open("01.py")
In : print f.read()
l = ['hello',1,3]
print ','.join(l)
In : f.close()
###方法二代码举例
In : with open('01.py') as f1:
...: print f1.read()
...:
l = ['hello',1,3]
print ','.join(l)
七、结合文件读写实现简单的用户注册登陆系统
7.1 ##用户注册:
代码如下:
f = open("users.txt","a+")
#f.write("wd:123\n")
#mes = ["kk:321\n","ss:456\n"]
#f.writelines(mes) ###可以直接将列表中的元素写到文件中去
while True:
name = raw_input("Please input you name :").rstrip()
passwd = raw_input("Please input you password: ")
repass = raw_input("Please confirm you password: ")
if len(name) == 0:
print "Name can't NULL,Input name again"
continue
if( passwd != repass) or (len(passwd) == 0) or (len(repass) == 0):
print "Password Wrong"
else :
tmp = ["%s:%s\n" %(name,passwd)]
f.writelines(tmp)
#print "tmp is %s" %tmp
print " OK "
break
f.close()
7.2 ####用户登陆
####登录代码:
#/usr/bin/python
import sys
f = open('users.txt','r')
tlist = []
for i in f.readlines():
print i.strip('\n')
t = i.strip('\n').split(":")
tlist.append(t)
print tlist
res = dict((x,x) for x in tlist)
print res
f.close()
####login Module
while True :
name = raw_input("Please input The username : ")
if name not in res.keys():
print "The user is not exists"
sys.exit(6)
time = 1
while time < 4:
pword = raw_input("Please input the password %s times :" %time)
if ( len(pword) == 0 ) or pword != res:
print "The password is Wrong"
else:
print "login Sucess"
sys.exit(0)
if time == 3:
sys.exit("三次密码输入错误,请联系管理员解锁")
time += 1
八、简单的HTML表单制作
8.1 简单的HTML表单标签
HTML参考资料:http://www.w3school.com.cn/
##用途,将日志中访问量最大的ip最做成网页表格,以便boss观看更为直观。
标签标签定义用法定义html的网页定义HTML 表格 定义HTML 表格中的行。
tr元素包含一个或多个th或td元素。定义HTML 表头。定义HTML 表格单元。 8.2 HTML表单小例子。
此项操作的目的:(如果是ip统计的话,一个简单的html表单绝对比命令行的awk、sort、uniq等命令筛选让boss看着更为直观)
统计单词后的结果为res_dict = {'!': 1, '.': 1, 'Bob': 1, 'I': 2, 'a': 1, 'am': 2, 'boy': 1}。将所有单词以及次数从大到小写入在网页文件中。
##代码如下
# cat writef.py
res = {'!': 1, '.': 1, 'Bob': 1, 'I': 2, 'a': 1, 'am': 2, 'boy': 1}
##实现字典的翻转,最终以次数为key,以单词组成的列表为value。
new = {}
for k ,v in res.items():
new.setdefault(v,[])##高阶用法
new.append(k)
print new
#keys = max(new)
#print "%s----> %s" %(keys,new)
##HTML标签,定义表格,定义表格中的一行,包含一个或者多个或者标签
f = open('tongji.html',"w+")
str = "timesword"
while True:
keys = max(new) ##通过max()函数取得key中最大值,并遍历其value
for i in new:
str += "%s%s" %(keys,i)
new.pop(keys) ####遍历完key的最大值后去掉,以便下一次取得最大值仍未重复
if len(new) == 0 :
break
str += "\n"
f.write(str)
f.close()
##最终tongji.html的效果图如下:
8.3 文件读取的扩展
如果10G以上的大文件日志分析,如果一次读取文件全部内容会导致电脑超负载的,此时正确的读取文件访问为偏移量的读取方式(仅为方案,等自己有空研究后在更新)。
f.read()===>一次读取几个字符
f.seek()===>一般使用f.seek(0)回到文档开始处
f.tell()===>告知所处的游标
页:
[1]