一句废话都没有的Pycharm(十四):关于文件的操作
介绍:
- 文件的读写
- 文件打开模式
- 文件对象常用方法
- with语句
- 例子
- 记录用户登陆日志
1. 文件的读写
文件的读写俗称“IO”操作。(取input和output的首字母)
通过IO操作将.py文件的内容与程序中的内容进行同步。
文件读写流程:
语法结构:
file=open(filename [,mode,encoding])
mode
为文件的操作模式:读®写(w)。默认模式为只读。
# 文件的相关操作
# 文件的读写
file=open('a.text', 'r')#当然你要新建一个a.text在同一目录下
print(file.readlines()) # 读取内容,以列表形式输出
file.close()
(这是我的a.text文件)
结果:(输出为列表形式)
2. 文件打开模式
按照文件中数据的组织模式,可以将文件分为两大类:
文件打开模式:
r在上面代码中已经演示过了。
w:
#文件的打开模式
#w:以只写模式打开文件,如果文件不存在则创建,如果文件存在则覆盖原有内容,文件的指针在文件的开头处
file=open('a.text', 'w')
file.write('hello word')
file.close()
结果:a.text中的内容被替换为hello word
a:
#a:以追加模式打开文件,文件不存在则创建,文件的指针在文件的开头处,如果文件存在则在文件末尾追加内容,文件指针在原文件末尾
file=open('b.text', 'a')#b不存在创建b.text
file.write('hello word')#运行两遍会发现有两个helloword,因为如果文件存在则在文件末尾追加内容
file.close()
结果:(我运行了两遍,所以有两个hello word)
r:
#b:以二进制方式打开文件,不能单独使用,需要与共它模式一起使用,rb或wb
ori_pic=open('image1.jpg', 'rb')#rb读取
tar_pic=open('copyimage1.jpg','wb')#wb写
print(tar_pic.write(ori_pic.read()))
tar_pic.close()
ori_pic.close()
首先我们得有一个image1.jpg在同一文件中,然后运行程序,会多一个copyimage1.jpg文件,它把image1.jpg的内容读写到自己的内容中了。
结果:
3. 文件对象常用方法
骨骼图:
代码:
#文件对象的常用方法
#读
#read([size]):从文件中读取size个字节或字符的内容返回,若省略[size],则读到文件末尾,即一次读取文件所有内容
#file=open('a.text', 'r')
#print(file.read()) # 读取全部内容
#print(file.read(5)) # 输出你好 你真,从文件中读取5个字节或字符的内容
#print(file.readline())#输出:你好。从文本文件中读取一行内容
#print(file.readlines())#输出:['你好\n', '你真漂亮\n', '可以叫我爸爸吗\n', '好孩子\n']把文本中的每一行都作为独立的字符串对象,并将这些对象放入列表返回
#写
file=open('a.text', 'w')
print(file.write('Shut up,Jon!'))#将字符串str内容写入文件
lis=['hello!','you are very beautiful,','please call me dad,','good boy!']
print(file.writelines(lis))#将字符串列表s_list写入文本文件,不添加换行符
#把文件指针移动到新的位置。
file=open('a.text', 'r')
file.seek(3)#注意中文字符,一个字是两个字节,不能写奇数1,3,5
print(file.tell())#返回文件指针的当前位置,当前在3
print(file.read())#指针移动到第三个字符之后的位置进行读
print(file.tell())#指针位置在最后,是79
#flush把缓冲区的内容写入文件,但不关闭文件
#把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源
#Flush之后可以写内容;close之后不可以写内容
file=open('c.text', 'a+')
file.write('I love')
file.flush()
print(file.read())
file.write(' you!')
file.close()
#如果将close()和flush位置调换,则程序报错
结果:
读的内容结果这里就不放了,注意一次只能print()一行。
4. with语句
with语句
可以自动管理上下文资源,不论什么原因跳出with语句块,都能确保文件正确关闭,以此达到释放资源的目的。换句话说,我们在使用with语句
时可以不使用close()
。
关于上下文管理器的解释:如果一个类它实现了特殊方法例如exit()
,那么我们称这个类遵守了上下文管理器协议,而这个类的实例对象称为上下文管理器。如果还是不太理解请看代码演示:
'''Pop实现了特殊方法__enter__、__exit__,称为该类对象遵守了上下文管理器协议;
该类对象的实例对象称为上下文管理器
'''
class Pop(object):
def __enter__(self):
print('__enter__执行完毕')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('__exit__执行完毕')
def show1(self):
print('show方法执行完毕')
def show2(self):
print('show方法执行完毕',1/0)#会出错
with Pop() as file:
file.show1()
file.show2()#会发现即使出错,也会执行exit().不论什么原因跳出with语句块,都能确保文件正确关闭
结果:
with语句语法:
with open('c.text','rb') as nfile:
nfile.read()
其中,open('c.text','rb')
称为上下文管理器。
with语句文件的复制:
#with语句文件的复制:
with open('1.jpg','rb') as nfile:
with open('copyimage1.jpg','wb') as rfile:
rfile.write(nfile.read())
结果:
5. 例子
1.记录用户登陆日志:
import time
def log_inf():
print('0:退出;1:查看日志')
def login(username):
with open('log.txt','a') as loggg:
s=f'用户名:{username},登陆时间:{time.strftime("%Y-%M-%D %H:%M:%S",time.localtime(time.time()))}'
loggg.write(s)
loggg.write('\n')
def sh_in():
with open('log.txt','r') as loggg:
while True:
timeline=loggg.readline()
if timeline=='':
break
else:
print(timeline,end='')
if __name__ == '__main__':
username=input('请输入用户名:')
password=input('请输入密码:')
if username=='Tom' and password=='123':
print('登陆成功!')
login(username)
log_inf()
a=int(input('请输入操作代号:'))
while True:
if a==0:
print('退出!')
break
elif a==1:
print('查看登陆日志。')
sh_in()
a = int(input('请输入操作代号:'))
else:
print('您的输入有误,请重新输入。')
sh_in()
a = int(input('请输入操作代号:'))
else:
print('您的用户名和密码错误,请重新输入。')
结果:
2.模拟淘宝客服自动回复
首先准备一个.txt文件
,注意和代码文件放在一个文件夹里,用起来方便。
我的是这样的:
代码:
def find(question):
with open('reply.txt','r') as file4:
while True:
line=file4.readline()
if line=='':
break
#分割关键字
keyword=line.split('|')[0]
reply=line.split('|')[1]
if keyword in question:
return reply
return False
if __name__ == '__main__':
question=input('你好,有什么问题块=快和小蜜说把?')
while True:
if question=='bye':
break
#在文件中查找
reply=find(question)
if not reply:
question=input('小蜜不知道您在说什么,请问小蜜一些关于物流、订单、退货、账户的问题吧,退出请说bye')
else:
print(reply)
question = input('请问还有什么问题,您可以说:物流、订单、退货、账户的问题吧,退出请说bye')
print('小主再见!有什么问题请问小蜜哦!')
结果: