Python学习笔记(九)—文件的操作
总结内容:
1、文件的基本操作步骤
2、文件的打开方式
3、操作文件用到的方法
4、练习
一、文件的基本操作步骤
1、找到操作的文件(如果在同一目录下使用相对路径;如果不在相同目录下要使用绝对路径)
2、打开文件
3、操作文件进行读写
4、关闭文件
二、文件的打开方式
1、open()方法
open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
格式:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
file: 必需,文件路径(相对或者绝对路径)。
mode: 可选,文件打开模式
buffering: 设置缓冲
encoding: 一般使用utf8
errors: 报错级别
newline: 区分换行符
closefd: 传入的file参数类型
opener:
说明:使用open方式打开文件,最后一定要记得使用close方法关闭文件
1 #打开test.txt文件 2 f = open('test.txt') #test.txt文件同py文件在同一目录下 3 print(f.read()) #读取文件中的所有内容 4 f.close() #关闭文件
2、使用with方式打开文件,使用该方式打开文件后,会自动关闭打开的文件
格式:with open(文件,操作方式) as 文件别名:
操作文件主体
with open('test.txt','a') as f: #以最近方式对文件进行操作 f.write('test11') #往文件中写入数据
三、操作文件用到的方法
说明:文件操作的模式包括:读、写、追加三种模式,默认读模式
r:以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式;如果文件不存在,程序将会报错
rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等
r+:打开一个文件用于读写。文件指针将会放在文件的开头。打开不存在的文件,程序报错;可以写入内容但是写入的内容会从文件的顶部开始覆盖原文件
w:打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb:以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+:打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。可以写入内容,但是由于会清空内容,所以返回值都是空
a:打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。常用模式,既可以读文件也可以写文件
1、读文件的方法
read()方法:读取文件中的所有内容,以字符串的方式进行展示。
f = open('test.txt','r+') res = f.read() print(res) f.close() 运行结果: test11
readline()方法:获取文件中的每一行的内容,以字符串形式展示
1 f = open('test.txt') 2 print(f.readline()) #打印第一行内容 3 print(f.readline()) #打印第二行内容 4 f.close() 5 6 运行结果: 7 test11 8 test12
readlines()方法:获取文件中所有的内容,以字符的形式展示
1 f = open('test.txt') 2 print(f.readlines()) #读取所有内容 3 f.close() 4 5 运行结果: 6 ['test11\n', 'test12\n', 'test13\n', 'test14\n', 'test15\n']
2、写文件方法
write()方法:向文件中写入指定字符串
1 f = open('test.txt','w') 2 f.write('test16') 3 f.close() 4 f = open('test.txt') 5 print(f.read()) 6 f.close() 7 8 运行结果: 9 test16
writelines()方法:向文件中写入一序列的字符串
1 a = ['list1\n','list2\n','list3\n'] 2 f = open('test.txt','w') 3 f.writelines(a) 4 f.close() 5 f = open('test.txt') 6 print(f.read()) 7 f.close() 8 9 运行结果: 10 list1 11 list2 12 list3
3、修改文件内容
方式一:
1 f = open('users.txt') 2 res = f.read().replace('test','wyh') 3 f.close() 4 f = open('users.txt','w') 5 f.write(res) 6 f.close()
方式二:
1 f = open('users.txt','a+') 2 f.seek(0) #将文件指针移动文件开始位置 3 res = f.read().replace('test','list') #将文件内容中的test修改为list 4 f.seek(0) 5 f.truncate() #清空文件里面的内容 6 f.write(res) 7 f.close()
方式三:
1 import os #导入os模块 2 f = open('users.txt') 3 f2 = open('users.txt.bat','w') 4 for line in f: 5 new_line = line.replace('list','test') #将文件内容中的list修改为test 6 f2.write(new_line) #将修改的内容,添加到文件2中 7 f.close() 8 f2.close() 9 os.remove('users.txt') #删除原文件 10 os.rename('users.txt.bat','users.txt') #将修改后的问题重命名
4、打开二进制文件并保存
1 import requests #导入requests模块 2 url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1584945092&di=ba5f1891ad196f22cb25394d459780d5&imgtype=jpg&er=1&src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farchive%2F40bbc6dc7f5691d5ee1e4f1aeaa307f4f745ee41.jpg' 3 res = requests.get(url).content #打开URL地址并以二进制形式进行读取 4 f = open('changba.jpg','wb') #以读模式打开文件 5 f.write(res) 6 f.close()
5、文件的高效处理
首先处理文件中的内容的流程大概是:CPU-->内存-->磁盘;首先把数据从磁盘中取出并放入到内存中,然后CPU处理的时候直接从内存中读取。但是内存的大小是有限制的,如果我们打开一个特别的大的文件,如果一下将所有内容都读取到内存势必会给内存带来很大的压力,所以处理大文件的时候我们尽量是逐行去处理。逐行读取代码的示例如下:
1 #使用while循环方式,读取文件 2 f = open('users.txt',encoding='utf-8') 3 while True: 4 line = f.readline() 5 if line != '': 6 print('line:',line) 7 else: 8 print('end') 9 break 10 f.close() 11 12 #使用for循环方式,读取文件 13 f = open('users.txt',encoding='utf-8') 14 f.seek(0) 15 for line in f: 16 print(line) 17 f.close()
6、其它方法
seek()方法:确定文件指针的位置
flush()方法:刷新缓冲区,即立即把缓冲区里面的内容写入磁盘
tell()方法:记录文件指针的当前位置
truncate()方法:清空文件的内容,需要配和指针使用
注意:如果写入文件报错的话需要制定字符编码
四、练习
练习:监控日志
1、从日志里面找到,1分钟之内超过20次访问的IP
2、脚本每分钟运行一次
思路:
1、读取文件内容,获取IP地址
2、把每个IP地址存起来,使用字典存储(避免重复)
3、判断IP访问的次数是否超过20次
4、加入黑名单
1 import time 2 point = 0 3 while True: 4 ips = {} 5 f = open(r'C:\Users\Administrator\Desktop\access.log', encoding='utf-8') #文件前边加入r代表路径中的特殊字符不会被转义 6 f.seek(point) 7 for line in f: 8 ip = line.split()[0] 9 if ip in ips: 10 ips[ip] += 1 11 else: 12 ips[ip] = 1 13 point = f.tell() # 记录文件指针的位置 14 for ip, count in ips.items(): 15 if count >= 20: 16 print('%s 加入黑名单!' % ip) 17 f.close() 18 time.sleep(60)