python使用笔记003-文件操作(一)

文件操作分为:

1、打开文件,如果文件在当前目录下直接写文件名,如果文件在其他目录下写绝对路径

2、读/写文件

3、关闭文件

一、文件打开模式

# 'r':只读,文件读取后,会有文件指针记录读取文件的行数
# 'w':只写,会把以前的内容清空掉,建议写新文件时,使用w模式
# 'a':只追加
# 'r+' == r+w(可读可写,文件若不存在就报错(IOError))
# 'w+' == w+r(可读可写,文件若不存在就创建)
# 'a+' ==a+r(可追加可写,文件若不存在就创建)
# 对应的,如果是二进制文件,就都加一个b就好啦:
# 'rb'  'wb'  'ab'  'rb+'  'wb+'  'ab+'

二、读文件

 1 f = open('a.txt','r',encoding='utf-8')#打开模式r w a
 2 result1 = f.readline()#读文件,一次只读一行
 3 print(result1)
 4 result = f.read()#读文件,获取文件里的全部内容
 5 result2 = f.readlines()#读文件,把文件里的内容放到一个list里,每一行是一个元素
 6 #f.read(),f.readlines()这两个方法当文件很大时,会占用很大的内存
 7 print(result2)
 8 #处理大文件的时候,循环读取
 9 for line in f:
10     print(line)
11 f.close()#关闭文件

三、写文件

1 f1 = open('a1.txt','w',encoding='utf-8')#打卡模式r w a
2 f1.write('12')#这个是一次写一行
3 #print(f.read())
4 l = ['fdslfjs
','fdsrewr
','fdsfsdfrere
']
5 f1.writelines(l)#将列表写到文件中
6 #循环写入
7 for i in l:
8     f.write(i)
9 f1.close()

四、监控日志小练习

 1 #1、监控,一直在运行,死循环,每分钟读一次文件
 2 #2、第一次运行,读取文件所有的内容,从文件内容里获取到IP地址,及每个IP地址出现的次数
 3 #3、判断每个IP地址出现的次数,如果大于大于50次,那么发短信告警
 4 #4、等待60秒,继续重复上面的操作,读文件,获取内容
 5 import time
 6 point = 0#最前面
 7 while True:
 8     ip_list = {} #ip:ipcount
 9     f = open('access.log', encoding='utf-8')
10     f.seek(point)#移动文件指针到哪个位置
11     for line in f:
12         ipStr = line.split()[0]
13         if ipStr not in ip_list:
14             ip_list[ipStr] = 1#不存在则加入统计
15         else:
16             ip_list[ipStr] += 1#存在则修改统计次数
17     point = f.tell()#当前文件指针的位置
18     f.close()
19     for ip in ip_list:
20         ipCount = ip_list.get(ip)#获取IP的统计次数
21         if(ipCount >= 50):
22             print('请求次数超过5次的IP:%s,请求次数为:%s'%(ip,ipCount))
23 
24     time.sleep(60)

五、排序小练习

 1 #根据每个人跑步的公里数 重新排序每个人的排名,格式 1. 毛多锁 500km
 2 #1、打开文件
 3 #2、将文件的内容循环读取,存放到字典中
 4 #3、给字典排序
 5 #4、将排序好的字典写到一个新的文件中
 6 
 7 run_scores = {}
 8 f = open('数据.txt',encoding='utf-8')
 9 for userinfo in f:
10     temp1 = userinfo.split()#用空格分割,将名字和跑步公里数分割
11     run_scores[temp1[1]] = float(temp1[2])#将文件中的内容放入字典中
12 
13 f.close()#关闭文件
14 print(run_scores)
15 #将字典进行降序排序
16 run_scores_sort = dict(sorted(run_scores.items(), key=lambda x: x[1],reverse=True))
17 print(run_scores_sort)
18 new_file = open('排序.txt','w',encoding='utf-8')#打开一个新的文件,用来存放排序后的内容
19 count = 0#定义编号
20 for temp2 in run_scores_sort:#遍历排序后的字典
21     count += 1
22     runScore = run_scores_sort[temp2]#获取跑步总公里数
23     result = '%d. %s %.2fkm
' % (count,temp2,runScore)
24     print(result)
25     new_file.write(result)#将排序后的结果写入新的文件
26 
27 new_file.close()

执行结果如图所示:

六、注册小练习

 1 #注册用户,注册的逻辑和以前一样,注册成功的用户写到users.txt里面,写的数据格式和文件里面的一样
 2 #1、输入注册的账号
 3 #2、注册的账号不能为空
 4 #3、注册的账号不能存在于users.txt文件中
 5 #4、注册的密码,确认密码不能为空
 6 #5、密码与确认密码一致,才能注册成功
 7 #6、将注册的账号,密码追加到users.txt文件中
 8 f = open(r'users.txt', 'r', encoding='utf-8')  # 将打开文件模式定义为r:只读
 9 results = f.readlines()#将文件内容读取到list中
10 f.close()  # 关闭文件
11 for i in range(3):
12     checkUser = False#定义一个检查用户是否存在的flag
13     username = input('请输入注册的账号:').strip()#获取输入的账号
14     if username:#注册账号不为空,则继续验证
15         for line in results:#循环读取文件,检查注册账号是否存在
16             userinfo = line.split(',')#分割
17             if username == userinfo[0]:
18                 checkUser = True
19                 print('输入的账号已存在!!!')
20 
21         if not checkUser:#当用户不存在时,进行注册
22             password = input('请输入注册的密码:').strip()  # 获取输入的密码
23             rePassword = input('请输入确认密码:').strip()  # 获取输入的确认密码
24             if password and rePassword:
25                 if password == rePassword:
26                     print('恭喜你,注册成功!')
27                     new_file = open(r'users.txt', 'a', encoding='utf-8')  # 将打开文件模式定义为a:可追加
28                     tempResult = '%s,%s
' % (username, password)
29                     print(tempResult)
30                     new_file.write(tempResult)
31                     new_file.close()  # 关闭文件
32                     break
33                 else:
34                     print('两次输入的密码不一致!')
35             else:
36                 print('密码/确认密码不能为空')
37     else:
38         print('输入的账号不能为空')
39 
40 else:
41     print('错误次数已达上限!')
原文地址:https://www.cnblogs.com/cjxxl1213/p/12782628.html