• day09-文件的操作


    文件的基本操作

    文件

    什么是文件

    可以把文件理解成是操作系统提供的虚拟的单位,有了文件我们可以读写数据,没有文件的话应该去硬盘上通过机械手臂寻找数据

    如何使用文件

    1. 打开文件
    2. 读写数据
    3. 保存
    4. 关闭文件

    打开&关闭文件

    打开&关闭文件

    方式一:用open打开文件,close关闭文件

    f = open(文件路径, 打开模式, 编码格式)		# 打开文件
    ...		# 读写数据(此处省略不写,下文进行详细介绍)
    f.close()		# 关闭文件
    

    方法二:open打开文件后我们还需要手动释放文件对操作系统的占用。但是其实我们可以用with打开文件,不需要用close关闭文件,文件时会自动关闭。(推荐使用)

    with open(文件路径, 打开模式, 编码格式) as file:
        ...
    # 用with打开文件时,不需要用close()关闭
    

    del f和f.close()的区别

    del f :只删除了变量名,但是文件对于操作系统来讲还是打开状态的

    f.close():不仅删除了变量名f,并且也关闭了文件,这个时候文件对于操作系统来讲是关闭状态。所以我们必须使用f.close()来关闭文件

    文件路径

    文件路径就是文件在计算机中存放的位置,在对文件进行操作时,文件路径分为绝对路径和相对路径

    绝对路径

    从根目录开始,一直到你需要的文件路径。如“C:Users86182Desktop est.txt”

    相对路径

    从当前文件夹开始,到你需要的文件路径,只需要输入文件路径,要打开的文件必须和运行的py文件必须得在一个文件夹下。如“text.txt”

    打开模式(不写默认是r)

    可读模式:分为 rt和rb。默认的r也就是rt,打开的text文本类型;rb表示你写的字符串为二进制,在打印的时候不需要使用终端的编码处理,直接打印原生的二进制即可)。当打开的文件不存在时,会报错。

    可写模式:分为 wt和wb。默认的w也就是wt,写入的是text文本类型;wb表示写入二进制。打开文件不存在时,会在该目录下新建该文件。文件存在时,会清空文件内容再写入

    可追加模式:分为at和ab。默认的a也就是at,在文件的末尾加入text文本类型;wb表示写入二进制。打开文件不存在时,会在该目录下新建该文件。

    可读可写模式:r+、w+ 、a+ 等,既可以读取数据,也可以写入数据

    注意:t、b不能单独使用,r、w、a可以单独使用

    编码格式

    打开该文件时所用的编码格式,不写默认是编辑器的编码格式

    补充(open内的路径前的r)

    由于路径里会出现“ ”、“ ”等特殊字符,r 告诉接下来的字符串,里面所有的特殊字符都变得无意义,以免找路径时出错

    fw = open(r'C:UsersY	est2.txt',mode='w',encoding='gbk')
    

    读取文件

    以'test.txt'文本文件为例

    read()

    一次性读取文件中的全部内容,返回一个字符串

    fr = open(r'C:UsersY	est.txt',mode='r',encoding='gbk')
    data = fr.read()		# 读出文件全部内容 
    print(data)
    
    Hello world!
    My name is nick
    Nice to meet you 
    

    readline()

    一次只能读取文件的一行,返回一个字符串

    fr = open(r'C:UsersY	est.txt',mode='r',encoding='gbk')
    data = fr.readline()		# 一次只能读取一行
    print(data)
    
    Hello world!
    

    readlines()

    将文件每行作为一个字符串,这些字符串以列表的形式读取出来,返回一个列表

    fr = open(r'C:UsersY	est.txt',mode='r',encoding='gbk')
    data = fr.readlines()
    print(data)
    
    ['Hello world!
    ', 'My name is nick
    ', 'Nice to meet you ']
    

    写入文件

    write()

    当打开模式为w时,先将文件内容清空后,再将数据写入到文件中;若打开模式为a时,直接在文件末尾添加数据

    fW = open(r'C:UsersY	est.txt',mode='w',encoding='gbk')
    fW.write("I am from China")
    

    文件的高级应用

    文件内指针的移动

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

    while open('test.txt',mode='r+',encoding='utf-8') as fr:
        fr.readline()
        fr.write('写入数据')		# 写在文件的最后一行
    

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

    seek(self, offset: int, whence: int = 0)

    offset代表文件指针的偏移量,单位是字节;whence为0表示从文件开头,为1表示从当前位置,为2表示从末尾

    with open(r'test.txt',mode='r',encoding='gbk') as fr:
        fr.seek(3,0)		
        data = fr.read()   
        print(data)
    # 将光标从文件开头偏移3个字节后的数据打印出来
    

    tell()

    查找光标所在的位置

    with open(r'test.txt',mode='r',encoding='gbk') as fr:
        fr.seek(3,0)
        print(fr.tell())
    # 光标所在的位置,此时返回的是3
    

    read(self, n: int = -1)

    光标后的字符个数n,一个中文1个字符,3个字节;一个英文一个字符,一个字节

    truncate(self, size: int = None)

    如果它有参数,则光标会跳到指定字节数后,然后把后面的文件全部清空

    文件拷贝

    如果:qq想修改这个程序,微信也想修改这个程序,两者都已经读取文件成功,都拿到了tank dsb,但是qq想修改tank dsb中的sa,微信想把s修改成b,这两个修改一定有先后顺序,假设qq先修改,那么s已经变成了a,但是微信找的到s吗?,找不到了,报错.

    qq想修改tank dsb中的sa,微信想把s修改成b,所以我给qq一份拷贝文件,我给微信一份拷贝文件,然后让他们各自修改,修改成功后,删除原文件,修改替换后的文件名为原文件

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

    with open('test.txt', 'r', encoding='utf8') as fr, 
            open('test_swap.txt', 'w', encoding='utf8') as fw: 
        for i in fr:
            i = i.replace('山水', '天下')
            fw.write(i)
    import os
    os.remove('test.txt')
    os.rename('test_swap.txt', 'test.txt')
    
  • 相关阅读:
    改变Prompt默认路径,Change Default Visual Studio Command Prompt Location
    msbuild,Build failed with Error MSB3073 exited with code 1
    the filename directory name or volume label syntax is incorrect
    常用sql语句记录
    EF中多表公共字段,以及设置EntityBase使所有实体类继承自定义类
    一种在MVC3框架里面设置模板页的方法,不使用_ViewStart
    Java内存模型
    Effective Java(1)-创建和销毁对象
    WireShark 查看UDP码流的丢包率
    拖延心理学读后感
  • 原文地址:https://www.cnblogs.com/863652104kai/p/10940247.html
Copyright © 2020-2023  润新知