文件处理

什么是文件:

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

为什么要用文件

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

文件的打开过程:

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

      

原文地址:https://www.cnblogs.com/littleb/p/11815654.html