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

    • 文件的复制

  • 相关阅读:
    【C++】C++代码动态检查
    【加解密】使用CFSSL生成证书并使用gRPC验证证书
    分库分表下跨库join解决方案
    解决1235
    为什么v-for中的key值不推荐使用index
    弹性布局公共样式总结
    关于python的模块
    [转]Ubuntu18.04安装uwsgi错误:error: lto-wrapper failed collect2: error: ld returned 1 exit status
    python 坐标遍历 生成笛卡尔积矩阵
    Mongo BsonUndefined 转换问题(自定义Mongo类型转换器)
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/10939722.html
Copyright © 2011-2022 走看看