• 文件处理


    什么是文件:

          操作系统提供的操作硬盘的工具

    为什么要用文件

          内存无法永久保存数据,要想永久保存数据需要把文件保存到硬盘中,而操作文件就可以实现操作硬件。

    文件的打开过程:

          1.点击需要打开的文件

          2.操作系统接收到命令,将文件路径传给cpu

          3.cpu根据路径去硬盘中寻找文件,读到内存中

          4.操作系统将调取的文件内容显示出来,可以进行读写保存等操作。

    python如何操作文件:

          从硬盘中读取数据

          用open(file,mode,encoding)函数打开某个具体文件

    f = open('day7practice.txt','r')
    print(f.readable()) # 判断当前文件是否可读
    print(f.writable()) # 判断当前文件是否可写
    f.close() # 回收操作系统资源
    del f # 回收变量资源   del f得在f.close()后,否则无法回收系统资源
    >>True
    >>False

               python 使用with关键字来进行回收

    with open('day7practice.txt','r') as f:
    print(f.readable())
    >> True #执行完子代码后with会自动执行f.close()

                 可用with同时打开多个文件,用逗号分隔开即可

    with open('day7practice.txt','r') as read_f,open('lll.txt',w") as write_f:

      data = read_f.read()

      write_f.write(data)  # 在lll.txtx中写入从day7practice.txt的内容

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

     f = open('lll.txt','r','encoding='utf-8')

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

          r(默认):只读   如果文件不存在,会报错

          w:只写     如果文件不存在,新建一个文件;如果文件内存在数据,清空数据,指针到文件开头,重新写入内容

          a:只追加  如果文件不存在,新建一个文件;如果文件内存在数据,指针跑到文件尾部,新内容写在旧内容后

    1.r模式的使用

      with open('lll.txt',mode = 'r',encoding = 'utf-8') as f:

        print(f.readline())   # 执行一次,打印一行内容

        print(f.readlines()) # 读取每一行内容,存放于列表中

        res = f.read()  #将文件内容从硬盘全部读入内存,赋值给res

    2.w模式的使用

      with open('lll.txt',mode = 'w',encoding = 'utf-8') as f:

        f.write('I ')

        f.write('am ')

        f.write('your ')

        f.write('dad' )

        f.write('I am your dad')

    3.a 模式的使用

      with open('lll.txt',mode = 'a',encoding = 'utf-8') as f:

        f.write('my ')

        f.write('son ')

        

     控制文件读写内容的模式

        前提:t模式都不能单独使用,只能与r,w,a连用

          t模式(默认):文本模式                 只能用于操作文本文件

            1.读写文件都是以字符串为单位

            2.只能针对文本文件

            3.必须指定encoding参数

          b模式:二进制模式

            1.读写文件都是以字节为单位

            2.针对所有文件

            3.一定不能指定encoding参数

     t模式对比:1.在操作纯文本文件时,t模式帮我们省略了编码解码环节,b模式需要手动编码解码,此时t模式更方便

           2.针对非文本文件(图片,音频,视频等)只能使用b模式

    操作文件的内置方法

      重点:读操作

          f.read()  # 读取所有内容,完成该操作后,文件指针移向文末

          f.readline() # 读取一行内容,完成该操作后,指针移向第二行开头

          f.readlines() # 读取每一行内容,存放于列表中

        写操作:

          f.write('111 222 333 ')  # 针对文本模式的写,需自己写换行符

          f.write('111 222 333 ,encoding='utf-8'') # 针对b模式的写,需自己写换行符

          f.writelines(['111 ','222 ']) #针对t模式

          f.writelines([bytes('111 ',encoding='utf-8'),('222 ',encoding='utf-8')])  # b模式

      了解 :

          f.readable() # 文件是否可读

          f.writable()  # 文件是否可写

          f.closed # 文件是否关闭

          f.encoding() #如果文件打开模式为b,则无该属性

          f.flush()  # 立刻将文件内容从内存刷到硬盘

          f.name  #文件名

    主动控制文件内指针移动

          f.read(n)  n=int   rt模式下设置读取字符的个数

                  rb模式下读取字节的个数

    with open('lll.txt','rt',encoding='utf-8')as f:
        data = f.read(3) #读取三个字符
        print(data)
    with open('111.txt','rb')as f:
        data = f.read(3)  #读取三个字节
        print(data)

          f.seek(offset,whence) #主动控制文件内指针移动

            offset:指针移动的字节

            whence:模式控制:0、1、2

              0:默认模式,指针从文件头开始

              1:从当前位置开始

              2:从文件末尾开始

              0模式可在t和b模式下使用,1和2只在b中使用

          0模式

    with open('lll.txt','rb')as f:
        f.seek(6,0)
        print(f.tell())  # 查看当前指针距离文件开头的位置
        print(f.read(3).decode('utf-8'))  #rb模式下读的是字节个数
    >>>你
    
    with open('lll.txt','rt',encoding='utf-8')as f:
        f.seek(6,0)
        print(f.read(2)) # rt模式下读的是字符个数
    >>>你爸

          1模式

    with open('lll.txt','rb')as f:
        f.seek(3,1)
        print(f.tell())
        #print(f.read())
        print(f.read().decode('utf-8'))
    >>>是你爸爸

          2模式

    with open('lll.txt','rb')as f:
        f.seek(0,2)   
        print(f.tell())  #输出为15
        f.seek(-3,2)     #指针往前3个字节
        print(f.read().decode('utf-8'))
    >>>爸

    文件修改

        

    with open('lll.txt','r+t',encoding='utf-8')as f:
        f.seek(9)
        f.write('父亲')
        f.seek(0)
        print(f.read())
    >>>我是你父亲

      #硬盘空间是无法修改的,硬盘中数据的更新是用新内容覆盖旧内容

      #内存中的数据可以修改

        文件修改方式:

          1.将文件内容一次性全部读入内存,然后在内存中修改完毕再覆盖写回原文件

           优点:在文件修改过程中同一份数据只有一份  缺点:过多占用内存

    with open('lll.txt','r',encoding='utf-8')as f:
        data = f.read()
        print(data)
    with open('lll.txt','w',encoding='utf-8')as f:
        res = data.replace('父亲','爷爷')
        f.write(res)

          2.以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完成后写入临时文件,删掉原临时文件,将临时文件命名为原文件名

             优点:不会占用过多内存   缺点:修改过程中同一份数据存了两份

    import os
    
    with open('lll.txt','r',encoding='utf-8')as rf,
            open('1111.txt','w',encoding='utf-8')as wf:
        for data in rf:
            res = data.replace('父亲','爷爷')
            wf.write(res)
    os.remove('lll.txt')
    os.rename('1111.txt','111.txt')

          

  • 相关阅读:
    选项菜单-OptionMenu
    Android Studio教程
    android 使用layer-list
    JavaScript OOP 学习总结
    Android应用中网络请求库Volley的使用
    Android应用中网络请求库Volley的介绍
    Android UI: LinearLayout中layout_weight 属性的使用规则
    Robot Framework 培训
    Begin :SWIFT 基本语法
    树莓派raspberrypi系统安装docker以及编译nginx和php镜像
  • 原文地址:https://www.cnblogs.com/littleb/p/11815654.html
Copyright © 2020-2023  润新知