Python学习之==>文件操作
1、打开文件的模式
1 r,只读模式(默认)【不可写;文件不存在,会报错】2 w,只写模式【不可读;不存在则创建;存在则删除内容】
3 a,追加模式【不可读;不存在则创建;存在则追加内容】
4 r+,读写模式【可读、可写、可追加,如果打开的文件不存在的话,会报错】
5 w+,写读模式【使用w+的话,已经存在的文件内容会被清空,可以读到已经写的文件内容】
6 a+,追加读写模式【不存在则创建;存在则只追加内容;】
2、文件基本操作
1 # 打开文件(python默认字符集为utf-8,windows为gbk,所以要指定encoding='utf-8'),不输入模式默认为r模式2 m = open('words',encoding='utf-8')
3 print(m.read()) # 读文件
4 print(m.readline()) # 读取第一行
5 print(m.readlines()) # 把文件的每一行放到一个list里面
3、文件操作方法
1 f = open('words','r+',encoding='utf-8') # encoding参数可以指定文件的编码2 f.readline() # 读一行
3 f.readable() # 判断文件是否可读
4 f.writable() # 判断文件是否可写
5 f.encoding # 打印文件的编码
6 f.read() # 读取所有内容,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
7 f.readlines() # 读取所有文件内容,返回一个list,元素是每行的数据,大文件时不要用,原因和上面一样
8 f.tell() # 获取当前文件的指针指向
9 f.seek(0) # 把当前文件指针指向哪
10 f.write('爱情证书') # 写入内容
11 f.flush() # 写入文件后,立即从内存中把数据写到磁盘中
12 f.truncate() # 清空文件内容
13 f.writelines(['爱情证书','孙燕姿']) # 将一个列表写入文件中
14 f.close() # 关闭文件
4、大文件读取高效操作方法
用上面的read()和readlines()方法操作文件的话,会先把文件所有内容读到内存中,这样的话,内存数据一多,非常卡,高效的操作,就是读一行操作一行,读过的内容就从内存中释放了,如下:
1 # 这样的话,line就是每行文件的内容,读完一行的话,就会释放一行的内存2 f = open('words',encoding='utf-8')
3 for line in f:
4 print(line)
5、文件指针
1 # 用来记录文件读到哪里2 # a模式的文件指针是在末尾的
3 m = open('name','a+',encoding='utf-8')
4 m.write('呃呃呃')
5 m.seek(0) # 移动文件指针到最前面
6 print(m.read())
7 m.write('呵呵呵') # 移动完文件指针之后,从前面开始读,但写的时候还是在文件末尾写
8 m.seek(0)
9 print(m.read())
6、自动关闭文件
在操作文件的时候,经常会忘了关闭文件。可以使用with,它会在使用完这个文件句柄之后,自动关闭该文件,使用方式如下:
1 # 打开一个文件,把这个文件的句柄付给f2 with open('file.txt', 'r') as f:
3 for line in f:
4 print(line)
5
6 # 这是多文件的操作,打开两个文件,fr是读file.txt,fw是新建一个file_bak文件
7 with open('file.txt') as fr,open('file_bak', 'w') as fw:
8 for line in fr: # 循环file.txt中的每一行
9 fw.write(line) # 写到file_bak文件中
7、修改文件
修改文件有两种方式:
- 一种是把文件的全部内容都读到内存中,然后把原有的文件内容清空,重新写新的内容
- 第二种是把修改后的文件内容写到一个新的文件中
第一种方式:
1 with open('words','r+',encoding='utf-8') as fr:2 res = fr.read() # 读出文件中的全部内容
3 new_res = res.replace('花','flower') # 将'花'替换成'flower'
4 fr.seek(0) # 将文件指针指向文件最开头
5 fr.truncate() # 清空文件
6 fr.write(new_res) # 将替换后的内容写入文件
第二种方式:
1 # 这个是多文件的操作,打开两个文件,fr是读file.txt,fw是新建一个file_bak文件2 import os
3 with open('file') as fr,open('new_file','w') as fw:
4 for line in fr: # 循环file.txt中的每一行
5 new_line = line.replace('花','flower')
6 fw.write(new_line) # 写到file_bak文件中
7 os.remove('file') # 删除文件
8 os.rename('new_file','file') # 改名
8、f.write()和f.writelines()
1 # f.write()只能写字符串2 a = ['abc\n','123\n','!@#']
3 f = open('name','w')
4 for i in a:
5 f.write(i)
6
7 # f.writelines()会循环把list当中的元素写入文件
8 a = ['abc\n','123\n','!@#']
9 f = open('name','w')
10 f.writelines(a)
9、练习
(1)随机产生手机号,输入多少个就产生多少个
import randomstart_num = '1387691'
f = open('test.txt','w',encoding='utf-8')
num = input('请输入要产生的手机号个数:')
for i in range(int(num)):
random_num = str(random.randint(1,9999)) # 随机产生一个1-9999的数字
new_num = random_num.zfill(4) # 不够四位,前面补0
phone_num = start_num + new_num
f.write(phone_num + '\n')
f.close()
(2)监控日志,一分钟读一次日志文件,如果一分钟之内访问博客的IP地址超过50次,就把这个IP记录下加入黑名单
1 # 分析:2 #打开日志文件
3 #把ip地址拿出来
4 #判断每一个ip出现的次数,如果大于50次,记录下来,加入黑名单
5 #每分钟读一次
6 import time
7 point = 0
8 while True:
9 all_ips = [] #存放所有的IP地址
10 f = open('access.log',encoding='utf-8')
11 f.seek(point) #移动文件指针
12 for line in f: #直接循环一个文件对象,每次循环的是文件的一行
13 ip = line.split()[0] #拿到IP地址
14 all_ips.append(ip) #把它存入数组当中
15 point = f.tell() #记录指针位置
16 all_ip_set = set(all_ips)
17 for ip in all_ip_set: #循环集合当中的IP,没有重复的
18 if all_ips.count(ip) > 50: #判断的是数组当中的IP
19 print('攻击的ip是:%s'%ip)
20 f.close()
21 time.sleep(2)
以上是 Python学习之==>文件操作 的全部内容, 来源链接: utcz.com/z/387543.html