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

    什么是文件:

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

    为什么要用文件

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

    文件的打开过程:

          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')

          

  • 相关阅读:
    BZOJ3752 : Hack
    XIV Open Cup named after E.V. Pankratiev. GP of SPb
    XIII Open Cup named after E.V. Pankratiev. GP of Ukraine
    BZOJ2087 : [Poi2010]Sheep
    BZOJ2080 : [Poi2010]Railway
    BZOJ2082 : [Poi2010]Divine divisor
    Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
    XIII Open Cup named after E.V. Pankratiev. GP of Asia and South Caucasus
    XIII Open Cup named after E.V. Pankratiev. GP of Azov Sea
    XIII Open Cup named after E.V. Pankratiev. GP of SPb
  • 原文地址:https://www.cnblogs.com/littleb/p/11815654.html
Copyright © 2011-2022 走看看