• python-(4-6)数据类型的应用(文件操作)


    一. 读取文本文件内容

    首先在当前python文件所在目录下创建一个文件名为test的测试文件
    里面的内容是

    1.我喜欢唱、跳、rap、篮球
    2.我喜欢唱、跳、rap、篮球
    3.我喜欢唱、跳、rap、篮球
    
    • 1
    • 2
    • 3

    该test文件与main.py的python在同一个目录下
    `

    在这里插入图片描述

    1. 简单读取文件

    然后执行下列代码:

    f = open("test", mode="r", encoding="utf-8")
    content = f.read()
    print(content)
    
    • 1
    • 2
    • 3

    打开一个文件要用到open("文件名",mode="r",encoding=“使用的编码方式”)

    首先文件名可以选择相对路径或绝对路径:
    相对路径是相对于当前文件而言,某文件的所在位置
    绝对路径是从某盘开始的详细文件路径(Windows),或者从根目录开始(Linux)。

    其次,mode表示对文件所采取的权限,r表示读取,即read的缩写

    最后,encoding表示使用utf-8的字符集编码。

    执行代码结果如下:
    在这里插入图片描述

    2. 按行读取文件

    在这里插入图片描述

    通过readline()我们可以一行一行的读取文件中的数据内容。但是执行上述代码后,根据结果我们发现,每打印一行内容,都空了一行,然后才输出下一行内容。
    这是因为在文件中,每句话的末尾隐藏了一个换行符;然后print()自身也带有换行符,
    因此最后的打印效果就是每段内容中间都间隔一行。

    如果不想有换行,可以通过strip()取消,它的作用是去掉字符串左右两端的空白,包括空格、换行、制表符
    这个知识点在前文提到过:python-(4-1)数据类型的应用(int、float、bool、字符串)

    :

    3. 读取全文内容,并将其放在列表中

    在这里插入图片描述

    此处可以看到,每行内容后面的确有一个换行符\n

    4. 最重要的读取文件的方式–for循环

    在这里插入图片描述

    二. 在文件中写入数据

    1. 写入数据

    直接执行下列代码
    如果没有test01文件,就可以创建一个,在当前目录下,文件名为test01的文件
    如果有test01文件,就会清空该文件中的内容

    f = open("test01.txt", mode="w", encoding="utf-8")
    
    • 1

    同理,此处的w就是write的缩写

    然后向文件中写入你好,朋友

    f.write("你好,朋友")
    
    • 1

    文件中就会存在该内容。

    最后记得关闭文件(只要使用了open(),不管是读还是写,都记得关闭文件)

    f.close()
    
    • 1

    2. 追加写

    紧接着上述文件test01的内容,增加一行内容你真棒

    f = open("test01", mode="a", encoding="utf-8")
    f.write("你真棒")
    f.close()
    
    • 1
    • 2
    • 3

    会在文件内容的末尾继续增加,而不是另起一行
    同理,a就是append的缩写

    3. 案例练习

    要求:存在列表list = ["张三", "李四", "王五"],将这些人名写入文件test02

    list = ["张三", "李四", "王五"]
    
    # 创建准备写的文件
    f = open("test02", mode="w", encoding="utf-8")
    
    # 遍历列表的所有名字
    for name in list:
        
        # 在文件中写入列表的名字
        f.write(name)
    
        # 写完后换下一行
        f.write("\n")
    
    # 关闭文件
    f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4. 使用with...as...读取或写入文件

    使用上述的语法打开文件,会经常忘记关闭文件。
    为了省略f.close()这一关闭文件的步骤,可以用另一种格式打开文件。

    with open("test", mode="r", encoding="utf-8") as f:
        for line in f:
            print(line.strip())
    
    • 1
    • 2
    • 3

    三. 读取非文本文件

    在当前目录下载了一个图片,希望能够读取

    with open("sky.webp", mode="rb") as f:
        for line in f:
            print(line)
    
    • 1
    • 2
    • 3

    其中mode中的b是bytes字节,表示读取到的是非文本文件

    四. 复制一个图片到其他目录下

    复制一个文件的本质是:先从源文件中读取内容,再将其写到新的路径下

    with open("sky.webp", mode="rb") as f1, \
         open("venv\sky2.webp",mode="wb") as f2:
         for line in f1:
             f2.write(line)
    
    • 1
    • 2
    • 3
    • 4

    注意:第一行代码最后的反斜杠表示,该行内容没有写完,它与下一行的代码在逻辑上是一行内容,只不过在此处为了美观我们将这一行代码分割成了两行。

    python的解释器执行代码是一行一行向下执行的,所以我们才会用到上述的反斜杠\

    五. 修改文件的内容

    需求:本目录下有一个包含人名的文件test03,要将所有姓的人的姓换成
    文件test03中的内容如下:

    杨过
    郭靖
    周伯通
    周星驰
    周杰伦
    周树人
    刘德华
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    思路:循环遍历每个人名,将修改后的内容其放在新生成副本文件中,再删除原文件,把副本文件重命名。

    代码:

    # 导入操作系统相关的模块
    import os
    import time
    
    # 打开并读取test03,创建并准备写入test03.bak
    with open("test03", mode="r", encoding="utf-8") as f1, \
         open("test03.bak", mode="w", encoding="utf-8") as f2:
        
        # 遍历test03文件
        for line in f1:
            
            # 将读取的文件内容进行处理,中间没有空行
            line = line.strip()
            
            # 如果是姓周的
            if line.startswith("周"):
                
                # 由于字符串不可改变,所以需要在字符串替换时重新赋值给新变量
                line = line.replace("周", "赵")
                
            # 将修改后的内容写入test03.bak
            f2.write(line)
            
            # 每写完一行,转行新起一行 
            f2.write("\n")
    
    
    # 利用time模块,程序休眠3秒钟(直观的看到test03.bak的创建和重命名)
    time.sleep(3)
    
    # 利用os模块,删除原来的test03文件
    os.remove("test03")
    
    # 利用time模块,程序休眠3秒钟
    time.sleep(3)
    
    # 利用os模块,将test03.bak的文件名修改为test03
    os.rename("test03.bak", "test03")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    常见聚类算法及使用--均衡的迭代并减少聚类中心的层次聚类(BIRCH)
    【吐槽&脑洞】关于逛B站时偶然体验的弹幕互动游戏魏蜀吴三国争霸游戏的一些思考
    对MMVAE中IWAE代码实现的理解
    Quasar搭建教程初体验
    Modbus通信协议介绍以及Modbus Poll、Slave软件使用介绍
    天文学专业大学院校排名(2024最新排行榜)
    目录启示:使用 use 关键字为命名空间内的元素建立非限定名称
    圆周率 π 小数点第 100 万亿数字是多少?Google 用 Debian 服务器给出了答案
    【Python数据挖掘 基础篇】Python数据挖掘是个啥?
    【题目精刷】2022紫光展锐-数字IC设计
  • 原文地址:https://blog.csdn.net/oldboy1999/article/details/126711121