我的Python成长之路---Day8-文件处理(补充)

版权声明:此博客实属作者原创,转载请注明出处! https://blog.csdn.net/Onion_cy/article/details/82786612

今天将昨天文件处理没有讲完的知识点进行了补充,python的学习也到了第一个小的阶段,文件处理的知识点很重要,今天补充过后还有两个是知识点没有讲完,剩下修改文件的两种方式和和文件内指针的移动两个知识点,讲完之后就要开始讲python学习中的函数部分了,从开始上课到现在马上半个月的时间了,自己也从一个一无所知的小白慢慢得对python有了一定的了解,但是从昨天突然意识到虽然上课的时候老师讲的知识点能够听得很明白,课下博客的总结也完全可以将白天的知识点回忆起来,但是去写代码的时候还是会有点蒙,有时候也不是没有思路或者逻辑,就是在按照逻辑走的时候,一些具体的操作实现不了,比如昨天写用户验证程序的时候,从把文件里边读出来的内容和输入内容进行对比这个过程怎么写都感觉不对,不能把文件中的用户名和用户名对应的密码和用户输入的用户名和密码对应的进行判断,这样的结果让我非常苦恼,同时也意识到自己这段时间的学习方法是不是不够好:上午的时候老师会讲今天的新内容,下午我会把上午讲的新内容进行总结,这个总结一般都会耗费一下午的时间,有时候晚上还会在写一会儿,之前没有每日作业的时候晚上会看明天的视频预习,但是现在有作业了,学的东西越来越多需要去大量时间去实际操作来巩固知识和将阶段内的知识点融会贯通并且熟练运用.同时要抽出时间来做作业,这样除了下午的总结时间外,还需要其他的时间来进行练习,看来看去也只有晚上的时间可以压榨了,并且最近也尝试了一下,不看视频只看每天的课堂笔记的预习方法,晚上抽出来时间看一下课堂笔记,心里有个大概印象,哪个知识点比较重要,哪个不是很好理解,第二天早上一般我会提前四十分钟左右来到学校,利用这段时间再进行预习和确定上午上课的时候需要去偏重听讲的知识点,然后下午还是照常认真总结,这样的预习方式虽然不如看视频的预习方式效果那么好,但是也不差,并且可以将每天晚上的时间空出来去做作业,做练习,在实践中对知识点进行巩固.所以,稍微改变一下学习方法.希望可以对现状有一定的改善,加油!

==============================================这是一条分割线======================================

一: 文件处理的三个步骤


1. 打开文件拿到文件对象(文件对象====>操作系统打开文件====>硬盘)
f=open(r'文件的路径',mode='文件的打开模式',encoding='字符编码')

                                                #绝对路径:C:\a\b\c.txt,/a/b/c/c.txt   指定文件所在路径,找不到时会进行报错

                                                  相对路径:相对于当前执行文件所在的文件夹为起始点进行查找:可以直接输入文件名,直接输入文件名时会执行程序所在py文件所在的文件夹下寻找输入的文件名,只会在当前文件夹中寻找,找不到就会进行报错 ; 如果要打开的文件在当前文件夹的子文件夹里边则需要指定路径,不过只需要从当前文件夹开始指定不用从盘符开始指定如:b/c/a.txt

2. 操作文件:读/写
f.read()
f.readlines()
f.readline()
f.readable()

3. 向操作系统发送指令关闭文件,回收操作系统资源
f.close()

二: 上下文管理

with open(r'文件路径',mode='打开文件的模式',encoding='字符编码方式') as 变量名:
with open(r'D:\上海python全栈4期\day08\今日内容',mode='rt',encoding='utf-8') as f:
    # data=f.read()
    # print(data)
    # print('='*100)
        name=input('>>: ')
        for line in f:
            print(line)

四、文件操作模式

一: 基本概念
打开文件的模式有三种纯净模式:r(默认的) w a

控制操作文件内容格式的两种模式:t(默认的) b
大前提: t/b模式均不能单独使用,必须与纯净模式结合使用
t文本模式:
  1. 读写文件都是以字符串为单位的
  2. 只能针对文本文件
  3. 必须指定encoding参数
b二进制模式:
  1.读写文件都是以bytes/二进制为单位的
  2. 可以针对所有文件
  3. 一定不能指定encoding参数

二 打开文件模式详解
1. r只读模式: 在文件不存在时则报错,文件存在文件内指针直接跳到文件开头
with open('a.txt',mode='rt',encoding='utf-8') as f:
    print(f.readlines())

用户认证功能
inp_name=input('请输入你的名字: ').strip()
inp_pwd=input('请输入你的密码: ').strip()
with open(r'db.txt',mode='rt',encoding='utf-8') as f:
    for line in f:                                                                 这里第一次循环时:line=['egon', '123']
        # 把用户输入的名字与密码与读出内容做比对       
        u,p=line.strip('\n').split(':')                                       这里    u,p=['egon', '123']     #u=egon    p=123
        if inp_name == u and inp_pwd == p:
            print('登录成功')
            break
    else:
        print('账号名或者密码错误')

2. w只写模式: 在文件不存在时会创建空文档,文件存在会清空文件(每次打开文件都会把原文件清空),并且文件指针跑到文件开头
with open('b.txt',mode='wt',encoding='utf-8') as f:
    print(f.writable())
    print(f.readable())
    f.write('你好\n')
    f.write('我好\n')                # 强调:在文件不关闭的清空时,后写的内容一定跟着前写内容的后面
    f.write('大家好\n')
    f.write('111\n222\n333\n')

    lines=['1111','22222','33333']
    for line in lines:
        f.write(line)
    f.writelines(lines)

注册功能:(即将用户输入的用户信息以一定的格式存到文档中永久保存)
name=input('username>>>: ').strip()
pwd=input('password>>>: ').strip()
with open('db1.txt',mode='at',encoding='utf-8') as f:
    info='%s:%s\n' %(name,pwd)           这里两个%s中间的:即可以定义写入用户信息的时的格式
    f.write(info)

3. a只追加写模式: 在文件不存在时会创建空文档,文件存在会将指针直接移动到文件末尾
with open('c.txt',mode='at',encoding='utf-8') as f:
    f.write('44444\n')
    f.write('55555\n')
    print(f.readable())
    print(f.writable())

r+ w+ a+      一些可读可写的特殊模式:  r+表示w方式的写入   w+表示可读可写   a+表示在追加写的情况写还可以进行读的操作

                                                               但是这些模式一般不常用,进行读写操作的时候通常分开进行
with open('a.txt',mode='r+t',encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())
    print(f.readline())
    f.write('你好啊')

b模式: 读写都是以二进制位单位           使用b模式时一定不能指定encoding,b模式是通用读写模式,不仅可以对文本文档进行操作,还可以对其他任意类型的文件进行操作,因为所有文件在硬盘上的存储方式都是一些二进制的数,使用b模式时,文件读出来的数据类型为特殊的Bytes类型.
with open('b.txt',mode='rb') as f:
    data=f.read()
    # print(data,type(data))                   比如在这里data的数据类型就是Bytes类型
    print(data.decode('utf-8'))

with open('1.png',mode='rb') as f:       比如使用rb模式打开图片,会显示图片在硬盘中所储存的二进制码
    data=f.read()
    print(data)

with open('d.txt','wb') as f:
    f.write('你好'.encode('gbk'))             在写入的时候可以指定写入时的字符编码方式,这时要注意在此打开该文件是要使用与写入时相同的编码方式才可以正常打开,不然会出现乱码的现象,,,可以使用对应的操作,encode 和decode来实现,在这里发现了一个有意思的事情,a=f.write('你好'.encode('gbk')),写入操作可以等于一个变量,打印的话会打印出来一个int数字,数字大小和写入的内容和后边指定的字符编码有关,数字具体是根据encode指定的字符编码所规定的的字符长度,然后看要写入的内容在规定下所占的Bytes个数,在这里a=4

扩展:文件的复制,其实文件的复制原理就是把文件的二进制从一个地方读取出来然后再找一个地方写入进去,这样就实现了文件的复制.下面是实现原理的代码:

with open('1.png',mode='rb') as f:
    data=f.read()

with open('2.png',mode='wb') as f:
    f.write(data)

拷贝工具的制作:
src_file=input('源文件路径: ').strip()
dst_file=input('目标文件路径: ').strip()
with open(r'%s' %src_file,mode='rb') as read_f,open(r'%s' %dst_file,mode='wb') as write_f:
    for line in read_f:
        print(line)
        write_f.write(line)

猜你喜欢

转载自blog.csdn.net/Onion_cy/article/details/82786612