zoukankan      html  css  js  c++  java
  • 文件的读写操作

    一、基本的文件操作

    1.什么是文件?

    文件是操作系统提供的虚拟的单位,有了文件我们可以读取数据,没有文件的话应该去硬盘上扣动机械手臂后寻找数据。

    文件的核心是:读和写

    2.为什么要有文件?

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

    3.如何使用文件?

    • 打开文件()

    • 读写数据

    • 保存

    • 关闭文件

      使用Python写一个小程序控制文件
      
       #print(fr.read())                    #read一次性读取所有数据
      
      #fr.close()              #不仅删除了变量名 f, 并且也关闭了文件,这个时候文件对于操作系统来讲是关闭状态的
      
    • 打开文件的那一瞬间是在操作硬盘和内存

    • python3能操控硬盘和内存吗?一定不能,因为他是应用程序。

    • 你看到的Python3打开文件并操控,都是基于操作系统的。

    • 然后你只是使用了 del f ,只是在删除f这个变量名的内存占用。但是我们从来都没有告诉操作系统关闭文件

    • 所以我们必须使用f.close()关闭文件

    二、绝对路径和相对路径

    绝对路径:从根目录开始,一直到需要的文件路径

    相对路径:从当前文件夹开始,到需要的文件路径,只需要输入文件路径,要打开的文件和运行的py文件必须得在一个文件夹下

    三、文件的三种打开方式

    文件操作的基础模式有三种(默认的操作模式为r模式)

    # mode='r', r模式为read,只读模式,只能读不能写,文件不存在时报错。
    # mode='w',  w模式为write,只写,清空文件在写入
    # mode='a',   a模式为append,追加,在后面追加写入文件
    

    文件读写内容的格式有两种(默认的读写内容的模式为b模式):

    t模式为text
    b模式为bytes
    

    需要注意的是:t、b这两种模式均不能单独使用,都需要与r/w/a之一连用。

      #mode='rb',  #打开的bytes类型,二进制#0101000011
      fr=open(r'D:Python视频Python9期视频day 09	est.txt',mode='rb')    #默认r=rt
      print(fr)
      bytes_data=fr.read()
      print(bytes_data)
    

    r , r告诉接下来的字符串,里面所有的特殊字符都变得无意义

    b表示,写的字符串为二进制,在打印时候不需要使用终端的编码处理,直接打印原生的二进制即可。

    r/w/a能单独使用。

    四、with 管理上下文

    之前使用open()方法操作文件,但是open打开文件文件后我们还需要手动释放文件对操作系统的占用。

    Python提供的上下文管理工具更方便-------with open(),不仅提供自动释放操作系统占用的方法,并且with open可以使用逗号分隔,一次性打开多个文件,实现文件的快速拷贝。

    with open(文件路径,打开模式(rt/wt/at/wb/ab),编码格式) as 变量名:

    变量名.read/wite

      with open('test.txt','r',encoding='utf8') as fr:
          data=fr.read()
          print(data)
    

    五、文件高级应用.py

    • r+t 可读、可写
    • w+t 可写、可读
    • a+t 可追加、可读

    r只读/w只写/a追加,可读可写(不推荐使用),r+,w+,a+

      # 指针(不要使用指针)
      with open('test.txt','rt+',encoding='utf8') as fa:
          # 3个字节,
          # fa.readline()
          fa.seek(5, 0)  # 字节算的
          # fa.seek(3, 1)
          print(fa.tell())  # 告诉你光标当前的位置
          print(fa.read(3))  # 光标后的字符个数,一个中文1个字符,3个字节;一个英文一个字符,一个字节
          fa.truncate(3) # 如果它有参数,则光标会跳到指定字节数后,然后把后面的文件全部清空
          fa.flush()
    
      nick 中文 245234234
      
      中文45234234  # 没有seek(3,0)  # 0表示文件头
      nic中文34234  # 有seek(3,0),seek(3,0)
      nick 245234234中文 # 有seek(0,2)  # 2表示文件末尾
      nick 2a5234234  # 有seek(3,1),seek(3,1) # 1表示当前位置,但是必须得以二进制的形式打开
      '''
      
      # 文件的写入没有插入一说,只有覆盖
      
    
    文件内指针移动:

    假设我们需要在文件内容中间的某一行增加内容,如果使用基础的r/w/a模式实现是非常困难的,因此我们需要对文件内的指针进行移动。

    硬盘上从来没有修改一说,硬盘上只有覆盖,即新内容覆盖新内容

    1. seek(offset,whence): offset代表文件指针的偏移量,单位是字节
    2. ell(): 每次统计都是从文件开头到当前指针所在位置
    3. read(n): 只有在模式下的read(n),n代表的是字符个数,除此之外,其他但凡涉及文件指针的都是字节个数
    4. runcate(n): truncate(n)是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate()要在r+或a或a+等模式下测试效果。它的参照物永远是文件头。并且truncate()不加参数,相当于清空文件。

    六、修改文件内容的两种方式:

    文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式

    方式一:一次性读所有

    将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

    方式二:逐行读取

    将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件。

    文件的拷贝

    文件不能插入,但是有需求要修改文件,插入。

    总结:

    • qq想修改这个程序,微信也想修改这个程序,两者都已经读取文件成功,都拿到了‘tank handsome'

    • qq想修改’tank handsome'中的‘h’为‘a’,微信想把‘h'修改为'b’,这两个修改一定有先后顺序,假如qq先修改了,那么‘h’已经变成了‘a’,微信就找不到'h'了,报错。

    • qq想修改’tank handsome'中的‘h’为‘a’,微信想把‘h'修改为'b’,所以给qq一份拷贝文件,给微信一份拷贝文件,让他们各自修改,修改成功后,删除原文件,修改替换后的文件名为原文件。

      减少了内存的占用

      w在清空文件,而不是wite清空文件

      文件只需要记住
    • with open(filename,mode,encoding) as file: file+操作

    • rt/rb/wt/at

    • 文件的复制

  • 相关阅读:
    如何优雅的进行表结构设计
    获取windows身份认证网站页面内容
    angularjs filter 详解
    OpenFileDialog 害人的RestoreDirectory
    iscroll5 版本下的 上拉,下拉 加载数据
    EasyUI Combotree 只允许选择 叶子节点
    国内5款优秀的WEB前端框架
    Serv-U无法连接到服务器127.0.0.1,端口43958 FTP服务器不能启动
    Directory.GetCurrentDirectory和Application.StartupPath的区别
    Winform 窗体设计器 无法识别重复成员变量声明的问题
  • 原文地址:https://www.cnblogs.com/zhoajiahao/p/10940236.html
Copyright © 2011-2022 走看看