文件的读写模式

文件操作

文件的简介

什么是文件

文件其实是操作系统暴漏给用户操作计算机硬盘的快捷方式。

文件的操作

通过编写代码自动操作文件的读写模式。

使用关键字open()括号内部写入,需要打开文件的路径字符串+r默认读取模式+参数指定字符编码。open前面用个变量名接收。

俩种方式

# 方式1:
f = open'a.txt','r',encoding='utf8') 
  	f.read() # 读取文件中所有内容
	f.close  # 关闭文件
# 方式2:
with open('a.txt','r',encoding='utf8') as f:
    f.read()
# 方式2不需要执行关闭文件步骤with语法帮助你来管理。
#当路径中有特殊符号的时候可能造成转义我们需要在路径字符串前面加r来取消特殊含义。
# 列如:
with openr'a.txt','r',encoding='utf8'as f;
	f.read()
# 在路径前面加个r俩种方式都可以用。

文件的操作模式

with语法支持一次性打开多个文件

with open(r'a.txt','rt',encoding='uft8')as f,with open(r'b.txt','rt',encoding='uft8')as f
	f.read
# 在没有想好子代码改写什么的时候可以使用 pass  补全python语法 pass不会执行操作只是简单的占位也不会报错!
"""通常情况下英语单词的结尾如果加上了able表示具备该单词描述的能力
 readable 具备读取内容的能力
 writable  具备填写内容的能力"""

文件操作的俩种模式

​ t模式(文本模式) b模式(二进制模式)

  1. t 文本模式

    文件操作的默认模式

    rt、wt、at、后面的t可以不写系统默认t模式,该模式只能操作文本文件,必须指定encoding=字符编码,读写都是以字符串为单位的。

    r只读模式,使用该模式打开的文件只具备读取的能力不能进行写入操作

    # r模式情况下文件路径必须是存在的如果不存在直接报错!!!
    with open(r'a.txt','r',encoding='uft8')as f:
        f.read()  
    # read读取功能
    

    w只写模式,使用该模式打开的文件只具备写入内容的功能不具备其它操作,默认模式下该写入的内容必须是字符串形式。

    with open(r'a.txt','w',encoding='utf8')as f1:
        f.write()  # 括号内写入内容 字符串格式
    """
    该模式下文件路径如果不存在则在你当前目录下新创文件
    如果填入存在的文件则直接覆盖该文件内容也会清空。
    """
    

    a尾部追加模式,使用该模式操作文件只具备尾部写入功能不具备其它能力。

    with open(r'a.txt','a',encoding='utf8')as f3:
        f3.write()
    
    """
    改模式下的文件路径如果不存在则会新增存在的话则会在当前文件里尾部写入
    一行一行的形式添加不做换行模式直到一直写满一行才进行下一行
    """
    
  2. b 二进制模式

    可以操作所有类型的模式

    rb、wb、ab。这种模式必须自己指定不能省略要全部写上

    该模式下能操作所有类型的文件不需要指定encoding参数,读写都是以bytes为单位的。

    # rb 模式 使用该模式打开的文件只能读取内容 不具备其他操作
    #r模式情况下文件路径如果不存在则直接报错
    with open(r'a.txt','r',encoding='uft8')as f:
    	f.read.()
    # wb 模式 使用该模式打开的文件只能写入内容 不具备其他操作。
    # 该模式下文件路径不存在则在你目前目录下新创文件
    # 如果填入存在的文件则直接覆盖改文件内容也会清空
    with open(r'a.txt','rb',encoding='uft8')as f:
    	f.write.()
    # ab 模式 使用该模式操作文件只具备尾部写入能力不具备其他能力
    # 改模式下的文件路径如果不存在则会新增存在的话则会在当前文件里尾部写入
    # 一行一行的形式添加不做换行模式直到一直写满一行才进行下一行
    with open(r'a.txt','at',encoding='utf8')as f:
    	f.write()
    

文件的诸多操作方法

raed()一次性读取文件内容并且光标会停留在末尾继续读则为空

当文件数据较大时不推荐一次性读取 可以使用for循环

for  line  in f:
	print(line) 
# 文件对象支持for循环
readlines() 按照行的方式读取所有内容并组织成列表返回
# readable ()判断当前文件是否可读
# weitable ()判断当前文件是否可写
# write()   填写文件内容
# writelines()支持填写容器类型(内部可以存放多个数据值的数据类型)多个数据值
# flush()将内存中的文件数据立即刷到硬盘相当于主动按住CTRL+s快捷键

文件的光标移动

  1. read()方法

 with open(r'user_info.txt', 'r', encoding='utf8')as write1:
# 1.自己定义读取几个字符的文件内容
# 这里是以字符为单位的。
# 在read括号里输入想要读取的字符的数量
 a = write1.read(3)
 print(a)  # jas
# 这个时候的光标在第三个字符位置停留接着读就等于从第三个字符按照指定数量读取下去
 b = write1.read(6)
 print(b)  # 光标概念on
  1. 查看光标 tell功能

    tell功能可以用来查看此时光标的位置在这个文件的第几个字节处这里数量是以字节为单位的。

    with open(r'user_info.txt', 'r', encoding='utf8')as write1:
        print(write1.tell())
    
  2. 代码控制光标移动

    seek功能

    ​ seek(offset,whence)

    offset 控制光标移动的位移量(以字节为单位)

    whence是seek功能的模式(以字节为单位)

    0 基于文件开头来控制光标跳过多少个字节来读取文件剩下内容。

    1 基于光标当前所在位置跳过多少个字节来读取剩下文件的内容

    2 基于文件的末尾来控制光标跳过多少字节来读取文件内容

    1和2只能在二进制模式下使用 0 则无所谓没有要求。

    # 0 模式 示例:
    # 0  基于文件开头跳过多少个字节来读取文件剩下内容。
     with open(r'user_info.txt', 'r', encoding='utf8')as write1:
         a = write1.read(2)  #  ja 读取文件中的二个字符
        print(a)  #  ja 打印读取的内容
         print(write1.tell())  #  3 查看光标此时所处的位置
     write1.seek(6, 0)
    # 可以理解为第一位相当于控制光标从哪里开始的位置
     print(write1.read())  #  概念on123
    # 这个时候读取出来的就是定义好光标位置之后的字符了
     print(write1.tell())  #44 此时读完光标是在第44个字符也就是文件末尾
    # 1 模式 示例:
     with open(r'user_info.txt', 'rb')as write1:
    # 表示6个字节一个英文一个字节一个中文3个字节# a = write1.read(6)
     print(a)  # b'jas\xe5\x85\x89'
    # 我们的文件是字符模式如果需要打印原来的字符还需要做一下编码转换的操作
     print(a.decode('utf8'))  # jas光
    # 此时我们的光标停留在光的后面
     write1.seek(6,1)
    # 此操作相当于在当前光标停留处在跳过六个字节来读取剩余的文件内容
     print(write1.read()) # b'\xe5\xbf\xb5on123\r\njas\xe5\x85\x89\xe6\xa0\x87\xe6\xa6\x82\xe5\xbf\xb5on123\r\n'
    # 也是需要做转换的
     print(write1.read().decode('utf8'))
    # 念on123
    # jas光标概念on123
    # 2 模式 示例:
     with open(r'user_info.txt', 'rb') as write1:
         write1.seek(-10,2)  #
         # 念on123   从文件的末尾取10个字节的二进制其中换行符占了2个字节
         print(write1.read().decode('utf8'))
         write1.seek(-4,2)  # 23
         print(write1.read().decode('utf8'))
    
  3. 2

文件的数据修改

机械硬盘储存数据的原理
1.数据的修改 其实是把修改后的数据直接覆盖掉原本的数据其实就是覆盖写
2.数据的删除 其实就是把这个数据从占有态改为自由态等着其他数据来覆盖它。

修改数据的方式

  1. 覆盖写 先读取文件内容到内存在内存中完成修改操作之后
    保存下来在用W模式将其覆盖写入

     with open(r'demo.txt','r',encoding='utf8') as f:
         data = f.read()
     new_data = data.replace('DSB','NB')
     with open(r'demo.txt','w',encoding='utf8') as f1:
         f1.write(new_data)
    # 优点:硬盘只占用一块空间
    # 缺点:数据量较大的时候会造成内存溢出
    
  2. 重命名
    先读取文件内容到内存在内存中完成修改
    保存到另外一个文件中
    再将原文件删除将新文件重新命名为原文件。

    import os
     with open('demo.txt', 'r', encoding='utf8') as read_f, \
             open('.demo.txt.swap', 'w', encoding='utf8') as wrife_f:
         for line in read_f:
             wrife_f.write(line.replace('NB', 'SB'))
     os.remove('demo.txt')  # 删除文件
     os.rename('.demo.txt.swap', 'demo.txt')  # 重命名文件
    #优点:不会造成内存溢出
    # 缺点:可能会在短暂的时间内需要占用硬盘俩个地方的空间也可能直接再内存中操作不会刷到硬盘。
    

函数的简介

1.循环

函数是带有名字的代码块,用于完成具体的工作,

有时候程序中需要多次执行同一种操作,如果每次需要的时候都写同样的代码

程序就会显得很长又很繁琐,可读性也差。 那这种情况就可以用函数将这一项任务写成函数体

在需要的时候直接调用函数即可, 这样以来解决了代码的重复性和可读性

 l1 = [1, 2, 3, 4, 5, 6]
 print(len(l1))  # 不允许使用len 完成列表数据值个数统计
# 自定义统计方法
 def my_len():
     value_count = 0
     for i in l1:
         value_count += 1
     print(value_count)
"""
 我们自己瞎写的缺陷
     1.只能统计某个固定的数据类型里面的数据值个数
     2.没有产生新的值(返回值)
"""

"""
1.循环
    在相同的位置反复执行相同的代码
2.函数
    在不同的位置反复执行相同的代码
"""
print(len(l1))
print(my_len())
posted @   瓮小辉  阅读(309)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示