python学习笔记(三)-元组、集合、文件操作、json模块

1、元组

1 #元组,不可变的list
2 #需要一个不可以被改变的list,就使用元组
3 t = ()#空的元组
4 t = ('127.0.0.1',3306,'root','123456')#元组
5 print(t[1])#元组取值,与list一样
6 # t[1] = 3308  元组不能修改,修改会报错
7 print(t.count(3306))#计算元素的个数
8 print(t.index(3306))#获取元素的位置

2、两种文件打开方式

1 #使用open打开文件,需要使用后关闭文件
2 f = open('user3.txt', 'a+', encoding= 'utf-8')
3 print(f.read())
4 f.close()
5 
6 # 使用with打开文件,文件会自动关闭,可以一次打开多个文件
7 with open('user3.txt','a+',encoding='utf-8') as f,open('a.txt','w') as f2:
8     f.seek(0)
9     print(f.read())

3、文件读写

 1 li = ['abc', 'xiaozi', 'xiaobai', 'xiaohei', 'xiaoming', 'xiaolan']
 2 
 3 #读文件
 4 f = open('names.txt','r',encoding='utf-8')#打开一个文件,可以写绝对路径
 5 res = f.read()#使用read方法读取文件全部内容
 6 print(res)
 7 res2 = f.read()#第二次再读取时光标位置指向末尾,所以读不到数据
 8 print('res2...',res2)
 9 f.close()#文件操作完毕需要关闭文件
10 
11 #写文件
12 f = open('names.txt','w',encoding='utf-8')
13 f.write(','.join(li))#只能是写字符串
14 f.write(str(li))
15 f.write('abc,123\n')#\n是换行符
16 f.write('bcd,123\n')
17 f.write('bcd3,123\n')
18 f.close()
19 
20 #其它方法
21 f.readline()#读取一行
22 f.readlines()#一行一行读取,存成一个list
23 f.seek(0)#设置文件指针到开头
24 f.tell()#返回文件指针的位置
25 f.flush()#把缓冲区的内容写进文件
26 l = ['123','456','789']
27 f.writelines(l) #传一个list,把list中的元素一个一个写进文件
28 
29 #循环文件,会一行一行的读取
30 with open('a.txt',encoding='utf-8') as f :
31     for line in f:
32         print('每次内容:',line)

4、文件打开模式

f = open('a.txt','r',encoding='utf-8')
#文件打开模式
#r  只读,文件指针在开头,默认的模式,文件不存在报错

#w  只写,打开后清空原来的文件内容,文件不存在自动创建

#a  追加模式,只能写不能读,文件指针指向末尾,追加在内容后面,文件不存在会创建

#r+  读写模式,可以读可以写,文件指针指向文件开头,写会覆盖原内容,文件不存在报错

#w+  写读模式,可写可读,打开后清空原来文件内容,文件不存在自动创建

#a+  追加读模式,文件指针放在文件末尾,追加内容在后面,使用seek改变指针位置写文件时不生效,只能追加在末尾,读文件时可以使用seek改变位置,文件不存在时自动创建

#只要是r文件不存在都会报错,只要是w打开文件都会清空内容,a模式是在末尾追加内容

 5、文件处理实例--修改文件

 1 #1、简单直接粗暴的
 2     #1、先读取到所有的内容,修改
 3     #2、然后清空原有文件的内容,再写入新的
 4 
 5 f = open('account.txt','a+')
 6 f.seek(0)
 7 l = []
 8 for line in f:
 9     line = line.strip()
10     line_list = line.split(',')
11     sum = int(line_list[1])+int(line_list[2])+int(line_list[3])
12     avg = sum//3
13     new_line = '%s,%s\n'%(line,avg)
14     l.append(new_line)#把所有的数据都存进list里
15 f.seek(0)
16 f.truncate()
17 f.writelines(l)#把list写进文件
18 
19 #2、高效的方式
20  #打开2个文件 a b,a只负责读,b只负责写,一次只处理一条数据,比较高效
21 import os
22 with open('account.txt') as  f,open('account2','w') as fw:
23     for line in f:
24         line = line.strip()
25         line_list = line.split(',')
26         sum = int(line_list[1])+int(line_list[2])+int(line_list[3])
27         avg = sum//3
28         new_line = '%s,%s\n'%(line,avg)
29         fw.write(new_line)
30         fw.flush() #立即写入文件
31 os.remove('account.txt')
32 os.rename('account2','account.txt')

6、实例--监控ip地址

# 找到每分钟访问超过20次的ip地址
#1、打开文件
#2、依次读取文件里面的每行
#3、取到每行里面的ip地址  split
#4、存到字典里面,ip做key,次数做value
#5、循环字典,如果value大于20,那么就输出出来
# {'ip1':1,'ip2':1,'ip3':1 }
# 192.168.90.90 - - [04/Jun/2017:03:44:13 +0800] "GET /wp-includes/logo_img.php HTTP/1.0" 302 161 "http://wp-includes/logo_img.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4
# 192.168.90.90 - - [04/Jun/2017:03:44:13 +0800] "GET /blog HTTP/1.0" 301 233 "http://wp-includes/logo_img.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko)

import time
point = 0#用来记录文件指针的位置
while True:
    with open('access.log',encoding='utf-8') as f:
        f.seek(point)#每一次运行时把文件指针指向新的日志
        ips  = {}
        for line in f:
            ip = line.split()[0] #取到ip地址
            if ip not in ips: #判断ip是否出现过,没有出现过ip的次数就是1
                ips[ip] = 1
            else:#出现过的话,次数就在原来的基础上+1
                ips[ip]+=1
        point = f.tell()#记录读完的位置
        for k,v in ips.items():
            if v>=20:
                print('有问题的ip地址是%s'%k)
    time.sleep(60)#每分钟运行一次

7、切片

 1 L = ['xiaomi',100,88,94]
 2 sum(L[1:])#内置函数,计算列表元素的和
 3 s = 'abc1234567'
 4 #切片顾头不顾尾
 5 print(s[0:3])
 6 print(s[:3])#前面数字不写代表从头开始取
 7 print(s[1:])#后面数字不写代表取到末尾
 8 print(L[:])#前后数字都不写,取全部的元素
 9 L[1:2] = [] #删除切片
10 del L[1:3]#删除切片
11 L[1:4] = [4,5,6] #修改切片
12 
13 nums = list(range(1,21))#取1到20的数组
14 print(nums[0:10:2])#第三个数字代表步长,隔2个数字取一个
15 print(nums[::-2])#步长为负数,取数时从右往左取

8、集合

 1 #集合可以去掉重复元素,集合是无序的
 2 
 3 L = [1,1,2,3,4,4,5]
 4 res = set(L)#把L转成一个集合
 5 print(res)
 6 
 7 res = list(res)#把集合转成list
 8 print("res: ",res) 
 9 
10 #交集,a、b里面都有的
11 s1 = {1,2,3,4}
12 s2 = {4,5,6,7}
13 print(s1.intersection(s2))#取交集
14 print(s1&s2)#取交集
15 stu1 = ['xxx','ccc','fff']
16 stu2 = ['xxx','ccc','rrr','iii']
17 print(set(stu1) & set(stu2))#转成集合,然后取交集
18 
19 #并集,合并a,b
20 print(s1.union(s2))
21 print(s1 | s2)
22 
23 #差集,a里面有,b里面没有
24 print(s1.difference(s2))
25 print(s1 - s2)
26 
27 #对称差集,把a和b里面都有的去掉
28 print(s1.symmetric_difference(s2))
29 print(s1^s2)

9、集合实例--验证密码包含大小写字母、数字、特殊字符

 1 import string
 2 password = input("请输入密码: ").strip()
 3 p_set = set(password)   #取到密码的集合
 4 print('大写字母取交集',p_set.intersection(set(string.ascii_uppercase)))   #将密码的集合与大写字母集合取交集
 5 print('小写字母取交集',p_set.intersection(set(string.ascii_lowercase)))
 6 print('数字取交集',p_set.intersection(set(string.digits)))
 7 print('特殊字符取交集',p_set.intersection(set(string.punctuation)))
#判断密码与大写、小写、数字、特殊字符的集合是否全部不为空
8 if p_set.intersection(set(string.ascii_uppercase)) \ 9 and p_set.intersection(set(string.ascii_lowercase)) \ 10 and p_set.intersection(set(string.digits)) and p_set.intersection(set(string.punctuation)): 11 print("密码合法") 12 else: 13 print("密码包含大写小写特殊字符")

10、json模块

 1 #存在文件里面的东西读出来都是字符串
 2 #json是一个字符串
 3 # 1、json.dumps()把字典转成字符串
 4 # 2、json.dump()把字典直接以json字符串存入文件
 5 # 3、json.loads()传一个字符串,把json字符串转成字典
 6 # 4、json.load(f)#传一个文件,把文件读出来转成字典
 7 
 8 import json
 9 
10 #json.loads() 传一个字符串,把json字符串转成字典
11 #1、打开文件
12 #2、读取文件内容
13 #3、json.loads把读到字符串转成字典
14 f = open('user4.txt',encoding='utf-8')
15 res = f.read()
16 # print('res的类型',res,type(res))
17 d = json.loads(res) #把json串转成字典
18 print('d: ',d)
19 
20 #使用json.load把字符串转成字典
21 #1、打开文件
22 #2、load
23 f = open('user6.txt',encoding='utf-8')
24 result = json.load(f)#传一个文件,把文件读出来转成字典
25 print(result)
26 
27 # json.dumps() 把字典转成字符串
28 #1、打开文件
29 #2、把字典dumps转成字符串
30 #3、把字符串写到文件里面
31 d = {"xiaomi":'123456',"xxx":'中文'}
32 #json.dumps()把字典转成json串,indent参数代表缩进,ensure_ascii=False有中文时不要显示成unicode
33 res = json.dumps(d,indent=4,ensure_ascii=False)#字典转换成字符串
34 print(type(res))#res类型是str
35 f = open('user6.txt','w',encoding='utf-8')
36 f.write(res)
37 
38 # json.dump() 把字典直接以json格式存入文件
39 #1、打开文件
40 #2、json.dump 写入
41 d= {
42         "error_code": 0,
43         "stu_info": [
44                 {
45                         "id": 8485,
46                         "name": "矿泉水2",
47                         "sex": "未知",
48                         "age": 38,
49                         "addr": "天通苑",
50                         "grade": "双子座",
51                         "phone": "12123685603",
52                         "gold": 100
53                 }
54         ]
55 }
56 fw = open('kqs.json','w',encoding='utf-8')
57 json.dump(d,fw,indent=4,ensure_ascii=False)#用dump直接把字典存进文件
posted @ 2019-04-14 12:33  颜颜blog  阅读(618)  评论(0编辑  收藏  举报