zoukankan      html  css  js  c++  java
  • 文件处理

    一、什么是文件

    操作系统提供给人操作硬盘的一个工具

    二、为什么要用文件

    因为人类和计算机要永久保存数据

    三、怎么使用文件

    3.1

    # 1.打开文件,由应用程序向操作系统发起调用oprn(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
    f = open('a.txt','r',encoding = 'utf-8') #默认打开模式就为r
    
    #2.调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作
    data = f.read()
    
    #3.向操作系统发起关闭文件的请求,回收系统资源
    f.close()
    

    3.2 资源回收与with上下文管理
    打开一个文件包含部分资源:应用程序的变量f和操作系统打开的文件。在操作完毕一个文件时,必须把与该文件的这两部分资源全部回收,回收方法为:

    1.f.close() #回收操作系统打开的文件资源
    2.del f #回收应用程序级的变量
    

    其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件系统无法关闭,白白占用资源,
    而python自动的垃圾回收机制决定我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close(),考虑到这一点,python提供了with关键字来帮我们管理上下文

    #1. 在执行完子代码块后,with会自动执行f.close()
    with open('a.txt','w') as f:
        pass
    #2. 可用with同时打开多个文件,用逗号分隔开即可
    with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
        data = read_f.read()
        write_f.write(data)
    

    3.3 指定操作文本文件的字符编码

    f = open(...)是由操作系统打开文件,如果打开的是文本文件,会涉及到字符编码问题,如果没有为open指定编码,那么打开文本文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
    这就用到了上节课将的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以书面方式打开。
    
    f = open('a.txt','r',encoding='utf-8')
    

    四、文件的操作模式

    4.1 控制文件读写操作的模式

    r(默认的):只读
    w:只写
    a:只追加写
    

    4.1.1案例一:r模式的使用

    # r只读模式:在文件不存在时则报错,文件存在文件内指针直接跳到文件开头
    with open('a.txt',mode='r',encoding='utf-8')as f:
        res = f.read()  #会将文件的内容由硬盘全部读入内存,赋值给res
        
    # 小练习:实现用户认证功能
    inp_name = input('请输入你的名字:').strip()
    inp_pwd = input('请输入你的密码:').strip()
    with open(r'db.txt'),mode='r',encoding='utf-8')as f:
        for line in f:
            # 请把用户输入的名字和密码与读出内容做比对
            u,p = line.strip('\n').split(:)
            if inp_name == u and inp_pwd == p:
                print('登陆成功')
                break
            else:
                print('账号名或密码错误')
    

    4.1.2 案例二:w模式的使用

    with open('b.txt',mode='w',encoding='utf-8')as f:
        f.write('你好\n')
        f.write('我好\n')
        f.write('大家好\n')
        f.write('111\n222\n333\n')
    #强调:
    # 1 在文件不关闭的情况下,连续的写入,后写的内容一定更在前写的内容的后面
    # 2 如果重新以w模式打开文件,则会清空文件内容
    

    4.1.3 案例三:a模式的使用

    # a只追加写模式:在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾
    with open('c.txt',mode='a',encoding='utf-8') as f:
        f.write('4444\n')
        f.write('55555\n')
    # 强调 w 模式和a 模式的异同:
    # 1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
    # 2 不同点:以a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后
    
    # 小练习:实现注册功能:
    name=input('username>>>:').strip()
    pwd=input('password>>>:').strip()
    with open('db1.txt',mode='a',encoding='utf-8')as f:
        info = '%s:%s\n' %(name,pwd)
        f.write(info)
    

    4.2 控制文件读写内容的模式

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

    4.2.1案例一:t模式的使用

    # t模式:如果我们指定的文件打开模式为r/w/a,其实默认就是rt/wt/at
    with open('a.txt',mode='rt',encoding='utf-8')as f:
        res=f.read()
        print(type(res)) # 输出结果为:<class 'str'>
        
    with open('a.txt',mode='wt',encoding='urf-8')as f:
        s = 'abc'
        f.write(s) #写入的也必须是字符串类型
        
    #强调:t模式只能用于操作文本文件,无论读写,都应该以字符串为单位,而存取硬盘本质都是二进制的形式,当指定t模式时,内部帮我们做了编码与解码
    

    4.2.2 案例二:b模式使用

    # b 读写都是以二进制位为单位
    with open('l.mp4',mode='rb')as f:
        data=f.read()
        print(type(data))  # 输出结果为:<class 'bytes>
        
    with open('a.txt',mode='wb')as f:
        msg='你好'
        res=msg.encode('utf-8') # res为bytes类型
        f.write(res) # 在b模式下写入文件的只能是bytes类型
    
    # 强调:b模式对比t模式
    1、在操作纯文本文件方面t模式帮助我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便
    2、针对非文本文件(如图片、视频、音频等)职能是用b模式
    
    # 小练习:编写拷贝工具
    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)
    

    五、操作文件的方法

    5.1

  • 相关阅读:
    POJ 2723 Get Luffy Out(2-SAT)
    ZOJ 3613 Wormhole Transport
    HDU 4085 Peach Blossom Spring
    NBUT 1221 Intermediary
    NBUT 1223 Friends number
    NBUT 1220 SPY
    NBUT 1218 You are my brother
    PAT 1131. Subway Map (30)
    ZSTU OJ 4273 玩具
    ZSTU OJ 4272 最佳淘汰算法
  • 原文地址:https://www.cnblogs.com/snailhuang/p/11821632.html
Copyright © 2011-2022 走看看