文件操作

注意:

  1. 操作文件(csv文件/txt文件),读取出来的文件都是字符串类型

Python读写文件模式

1、r 打开只读文件,该文件必须存在。
2、r+ 打开可读写的文件,该文件必须存在。
3、w 打开只写文件,若文件存在则文件长度清为0(只要一打开,先做清空操作),即该文件内容会消失。若文件不存在则建立该文件。
4、w+ 打开可读写文件,若文件存在则文件长度清为零(只要一打开,先做清空操作),即该文件内容会消失。若文件不存在则建立该文件。
5、a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
6、a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

1、r 打开只读文件,该文件必须存在。

#已创建a.txt文件
在这里插入图片描述
f.read() # 读所有东西,返回字符串

f = open('a.txt','r',encoding='utf-8')
result1 = f.read()# 读所有东西,返回字符串
print(result1)

输出结果:
C:\Users\m\AppData\Local\Programs\Python\Python38\python.exe D:/Python/project/geng_juans_homework/day3/操作文件.py
大理
丽江

Process finished with exit code 0

f.readlines() #读所有东西,返回列表

f = open('a.txt','r',encoding='utf-8')
result2 = f.readlines()#读所有东西,返回列表
print(result2)

输出结果:
C:\Users\m\AppData\Local\Programs\Python\Python38\python.exe D:/Python/project/geng_juans_homework/day3/操作文件.py
['大理\n', '丽江']

Process finished with exit code 0

f.readline() #只读一行

f = open('a.txt','r',encoding='utf-8')
result3 = f.readline()#只读一行
print(result3)
print(f.readline())#再读一行

输出结果:
C:\Users\m\AppData\Local\Programs\Python\Python38\python.exe D:/Python/project/geng_juans_homework/day3/操作文件.py
大理

丽江

Process finished with exit code 0
2、r+ 打开可读写的文件,该文件必须存在。
3、w 打开只写文件,若文件存在则文件长度清为0(只要一打开,先做清空操作),即该文件内容会消失。若文件不存在则建立该文件。
f = open('a.txt','w',encoding='utf-8')
f.write('再见')#只能写字符串
f.close()#写完文件后必须要关闭文件

输出结果:
在这里插入图片描述
#换行输入

f = open('a.txt','w',encoding='utf-8')
addr = ['大理\n','丽江']#可换行输写入文件
f.writelines(addr)#有循环功能,可以写入list,只能写字符串
f.close()

输出结果:
在这里插入图片描述

f = open('a.txt','w',encoding='utf-8')
addr = ['大理\n','丽江']#可换行输写入文件
f.writelines(addr)#有循环功能,可以写入list,只能写字符串
f.close()

输出结果:
在这里插入图片描述

4、w+ 打开可读写文件,若文件存在则文件长度清为0(只要一打开,先做清空操作),即该文件内容会消失。若文件不存在则建立该文件。
5、a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
6、a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
在文件最前面添加
f = open('a.txt','a+',encoding='utf-8')
f.write('\n香格里拉')#在文件末尾写入'香格里拉'
f.seek(0)#文件指针一道最前面
result = f.read()#读出所有内容
new_result = '龙龙\n'+result#把'龙龙'拼接在文件最前面,此时字符串名为new_result
f.close()
f2 = open('a.txt','w',encoding='utf-8')#再次打开并清空文件a.txt
read_new_result = f2.write(new_result)#读在开头写入'龙龙'后的文件,new_result结果
f.close()

输出结果:
在这里插入图片描述

清空文件
f = open('a.txt','a+',encoding='utf-8')
f.write('\n香格里拉')#在文件末尾写入'香格里拉'
f.seek(0)#文件指针一道最前面
result = f.read()#读出所有内容,此时文件指针在最前面
new_result = '龙龙\n'+result#把'龙龙'拼接在文件最前面,此时字符串名为new_result
f.seek(0)#文件指针挪到最前面,才能清空文件所有内容
f.truncate()
f.write(new_result)#读在开头写入'龙龙'后的文件,new_result结果
f.close()

输出结果:
在这里插入图片描述

文件指针

当我们读取文件内容时,并不能重复的读取,比如一个blog.txt文件里有blog内容,用两个read()方法读取blogCblog.txt的内容,会发现,第一个返回文件内容,第二个返回‘’。并不能重复读取,如果我想重复读取呢?怎么解决。

其实这跟文件指针有关,当我们对文件操作时,文件内部会有一个
文件指针来定位当前位置,如图:

在这里插入图片描述

with 自动打开/关闭文件,不需要再次关闭文件

with open(‘words.txt’) as fr

大文件操作

读出文件内容
with open('geng.txt',encoding='utf-8') as f:#f是文件对象,文件句柄
    for line in f:#直接循环f的每一行,输出的就是文件的内容
        line = line.strip()#如果有空行/头尾空格,去除
        if line:#如果line不为空
            print(line)#输出每一line的内容
输出结果:
啦啦啦
撒大声地所,胜多负少的
宋丹丹个人,一跑
饿货,一一
修改文件内容

#1、读取到文件所有内容
#2、替换 new_str
#3、清空原来的文件
#4、写进去新的
import os
with open('word.txt') as fr,open('new_word.txt','w')as fw:#打开原文件,再新建一个新文件做文件写入使用
    for line in fr:#读出fr里面的全部内容
        line = line.strip()#去除每一行的空格
        if line:#如果line不为空
            line = line.lower()#将每行内容切换小写
            fw.write(line+'\n')#文件内容换行输出,因为上面做了去除空格和去除换行操作
os.remove('word.txt')#删除旧文件
os.rename('new_word.txt','word.txt')#新文件名替换成旧文件名
练习

1、监控日志文件,找到每分钟请求大于200的ip地址,加入黑名单

#1、监控日志文件,找到每分钟请求大于200的ip地址,加入黑名单

import time
point = 0
while True:
    ips = {}#字典需要定义在循环里面,如果定义在外面,字典会越来越大,已经读过的ip还会再加到字典里
    f = open('access.log', encoding='utf-8')
    f.seek(point)#定义文件指针,每次指针指向上次ip出现的位置
    for line in f:
        line = line.strip()
        if line:
            ip = line.split()[0]#文件以空格做分割,取第一位就是ip
            if ip in ips:
                ips[ip] +=1#python,统计字典中的key出现的次数
            else:
                ips[ip] = 1#python,统计字典中的key出现的次数
    point = f.tell()#记录当前文件指针的位置
    f.close()
    for ip in ips:
        count = ips[ip]
        if count>200:
            print('要加入黑名单的ip地址是:{},已出现{}次'.format(ip,count))
    time.sleep(60)
   
  输出结果:
  要加入黑名单的ip地址是:121.69.45.254,已出现203
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值