一句废话都没有的Pycharm(十五):关于文件的操作

一句废话都没有的Pycharm(十四):关于文件的操作

介绍:

  1. 文件的读写
  2. 文件打开模式
  3. 文件对象常用方法
  4. with语句
  5. 例子
    1. 记录用户登陆日志

1. 文件的读写
文件的读写俗称“IO”操作。(取input和output的首字母)

input
output
.py文件
程序

通过IO操作将.py文件的内容与程序中的内容进行同步。
文件读写流程:

Created with Raphaël 2.2.0 python操作文件 打开或新建文件 读、写文件 关闭资源

语法结构:

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()一行。
write的结果
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('小主再见!有什么问题请问小蜜哦!')

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值