python打开一个不存在的文件一定会报错吗,Python(六)操作文件+非空即真

文件的基本操作

r:只读(默认),不能写,在打开文件时,r可以省略不写,打开不存在的文件会报错

0e627075f92c50f8c0169c0214fa8b60.png

w:只写模式,不可读:不存在的文件则会创建,存在的文件会清空文件内容

6669ea7607be1fcb35c346bc1f0be33e.png

a:追加模式,不可读:不存在的文件会创建,存在的文件会追加

fb7f67009789b4727b43fb87e88ad6f5.png

r+:可读,可写,。打开不存在的文件会报错

a11498a76dd75c0420eef13e4cfad725.png

w+:读写模式,已经存在的文件,内容会被清空,可以读到已经写得内容

f65f86eb244833eebf0ee74d03d7d3a1.png

a+:追加读写模式,不存在则创建,存在则只追加内容

47d2383f4e959146f4d2d41e095b1b2b.png

文件的操作方法

readlines():读取文件所有内容,把每行的内容放到一个list里面

51a68b64a5736103ce0d7ac8ea2d12df.png

readline():读取文件里面第一行的内容

fd56e0670ab3080f5957e23304731e8b.png

read():读取文件的所有内容

seek():文件指针

1、当前文件指针指到哪,seek(0):指到文件的最前面

2、read与readlines文件指针到文件的最后一行;readline文件指针到第二行

907a5dbf936198e289364be1c1a65ac9.png

write():写入内容,传的内容必须得是字符串

flush():写入文件后,刷新缓冲区,立即写到磁盘上.例如f.write()文件没有写入成功,那就就要用.flush方法,文件就会更新,即写入成功了

tell():获取当前文件的指针指向

truncate():清空文件内容

writelines():会循环list里面的每一个元素都写进文件里面去

高效读取文件

思路:直接循环文件对象,每次取得的就是文件里的每一行,直接使用for循环即可

6a43aa798aa2c48fb77539117560cefe.png

with使用方法

with:会在使用完这个文件之后,自动关闭文件,用法如下:

ee379d064392418c982590c8714ea8f9.png

修改文件

修改文件的话,有两种方式,一种是把文件的全部内容都读到内存中,然后把原有的文件内容清空,重新写新的内容;第二种是把修改后的文件内容写到一个新的文件中

第一种:

3bfd7be25c31309e73b05549448b87c2.png

第二种:

6af45953642347835a6cd3bc4ff47e53.png

非空即真、非0即真

TRUE:真

false:'' none,[],{}

非空即真:

a9d27e789af92a4700fbbb55d4473f87.png

非0即真:

af8f6a60b57232c14569f4e67bb7e0e6.png

练习:

#-*-coding:utf-8-*-

#需求:每分钟监控服务器日志,IP请求超过200次的,加入黑名单

#

#1、读文件,获取到每行的内容,open readlines

# 178.210.90.90 - - [04/Jun/2017:03:44:13 +0800]

#2、找到IP,按照空格分隔字符串,取第一个元素,split

# 3、把IP存到字典里,每个IP出现一次,IP次数就+1

# 4、判断IP次数是否大于200,加入黑明单

import time

point=0#定义一个指针为0,即在文件的最上边

while True:#循环

ips={}#定义一个空字典

f=open('access.log',encoding='utf-8')

f.seek(point)#指定到指针的位置

for line in f.readlines():#循环文件里的每一行,即生成list

#获取所有的IP和次数存在字典里

ip=line.split()[0]#list里面按照空格分隔字符串,第一个元素即为ip,存在变量ip里面

#print(ip)

if ip not in ips:#

ips[ip]=1#如果从list里面取到的ip不在字典ips里面,那么这个ip对应的value=1

else:

ips[ip]+=1#如果从list里面取到的ip在字典ips里面,那么这个ip对应的value的值就+1

point=f.tell()#记录读完之后的文件指针

for k,count in ips.items():

if count>200:

print('[%s]加入黑明单 '%ip)

#print(ips)

time.sleep(60)

修改文件:

文件内容如下:

a4e30b18f0183510de35c7c75e0563b7.png

#-*-coding:utf-8-*-

# 把文件里面没有交作业的人名字后面加上‘没有交’

# 已经交作业的加上‘交了’

# 1、读文件

# 2、按照空格分隔每个人的作业信息

import os

with open('stu.txt',encoding='utf-8')as fr,open('.new_stu','w',encoding='utf-8')as fw:#打开两个文件

for line in fr:#在fr里面循环取每一行的数据

line_list=line.split()#按照空格分隔字符串,生成list

if len(line_list)>1:

line_list[-1]='已交\n'

else:

line_list.append('未交\n')

fw.writelines(line_list)

os.remove('stu.txt')

os.rename('.new_stu','stu.txt')

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值