• 5. Python 文件操作


    1. 文件的编码

    什么是编码?
    编码就是一种规则集合,记录了内容和二进制间进行相互转换的逻辑。
    编码有许多中,我们最常用的是 UTF-8 编码。

    为什么需要使用编码?
    计算机只认识 0 和 1,所以需要将内容翻译成 0 和 1 才能保存在计算机中。
    同时也需要编码,将计算机保存的 0 和 1,反向翻译回可以识别的内容。

    2. 文件打开

    使用 open 函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下:
    open(name, mode, encoding)
    name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
    mode:设置打开文件的模式(访问模式):只读、写入、追加等。
    encoding:编码格式(推荐使用UTF-8)

    示例代码:

    # encoding的顺序不是第三位,所以不能用位置参数,要用关键字参数直接指定
    f= open('D:/python.txt', 'r', encoding="UTF-8")
    print(type(f))#
    
    • 1
    • 2
    • 3

    注意:此时的 f 是 open 函数的文件对象,对象是 Python 中一种特殊的数据类型,拥有属性和方法。可以使用对象.属性对象.方法对其进行访问。

    mode常用的三种基础访问模式:

    模式描述
    r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    若以 ”r“ 方式打开一个不存在的文件,会报错。
    w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。如果该文件不存在,创建新文件。
    a打开一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

    2. 文件的读取

    (1) read() 方法
    文件对象.read(num)
    num 表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,就表示读取文件中所有的数据。

    f= open('D:/python.txt', 'r', encoding="UTF-8")
    print(f"读取10个字节:{f.read(10)}")
    print(f"读取全部内容:{f.read()}")
    f.close()#关闭文件,否则文件会一直被占用
    
    • 1
    • 2
    • 3
    • 4

    文件内容:
    在这里插入图片描述

    输出结果:

    读取10个字节:1234567890
    读取全部内容:abcdefhijklmnopq
    rstuvwxyz
    
    • 1
    • 2
    • 3

    可以看到,“读取全部内容” 读的是 “读取10个字节” 之后的内容。

    (2) readlines() 方法
    readlines 可以按照行的方式把整个文件中的内容进行一次性读取,返回的是一个列表,其中每一行的数据为一个元素。

    f= open('D:/python.txt', 'r', encoding="UTF-8")
    lines = f.readlines()
    print(lines)
    print(type(lines))
    f.close()#关闭文件,否则文件会一直被占用
    
    • 1
    • 2
    • 3
    • 4
    • 5

    输出结果:

    ['1234567890abcdefhijklmnopq\n', 'rstuvwxyz']
    <class 'list'>
    
    • 1
    • 2

    注意:每个元素末尾有\n,最后一个元素末尾可能没有。

    (3) readline() 方法
    readline() 方法一次读取一行内容。

    f = open('D:/python.txt')
    content = f.readline()
    print(f'第一行:{content}')
    content = f.readline()
    print(f'第二行:{content}')
    f.close()#关闭文件,否则文件会一直被占用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出结果:

    第一行:1234567890abcdefhijklmnopq
    
    第二行:rstuvwxyz
    
    
    • 1
    • 2
    • 3
    • 4

    (4) for 循环读取文件行

    f = open("D:/python.txt", "r")
    #每一个linel临时变量,记录了文件的一行数据
    for line in f:
        print(line)
    f.close()#关闭文件,否则文件会一直被占用
    
    • 1
    • 2
    • 3
    • 4
    • 5

    输出结果:

    1234567890abcdefhijklmnopq
    
    rstuvwxyz
    
    • 1
    • 2
    • 3

    (5) with open
    使用 with open 对文件进行操作,可以在操作完成后自动 close 文件,避免忘记 close。

    with open("D:/python.txt","r") as f:
        for line in f:
            print(line)
    
    • 1
    • 2
    • 3

    输出结果:

    1234567890abcdefhijklmnopq
    
    rstuvwxyz
    
    • 1
    • 2
    • 3

    【例】将如下内容,复制并保存到:word.txt。

    itheima itcast python
    itheima python itcast
    beijing shanghai itheima
    shenzhen guangzhou itheima
    wuhan hangzhou itheima
    zhengzhou bigdata itheima

    通过文件读取操作,读取此文件,统计itheima单词出现的次数。

    方法1:

    f = open("D:/word.txt", "r", encoding="utf-8")
    print(f.read().count("itheima"))#输出6
    
    • 1
    • 2

    方法2:

    f = open("D:/word.txt", "r", encoding="utf-8")
    sum = 0
    for line in f:
        line = line.strip("\n")
        words = line.split(" ")
        for word in words:
            if word == "itheima":
                sum +=1
    print(sum)
    f.close()#输出6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    方法3:

    sum = 0
    with open("D:/word.txt", "r") as f:
        for line in f:
            sum += line.count("itheima")
    
    print(sum)#输出6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3. 文件的写入

    #1.打开文件
    f = open("D:/python.txt", "w", encoding="utf-8")
    #2.文件写入
    f.write("hello world")
    #3.内容刷新
    f.flush()
    #...
    #f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    注意:

    • w 模式:打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。如果该文件不存在,创建新文件。
    • 直接调用 write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区。
      当调用 flush(或 close,close 方法内置了 flush 的功能)的时候,内容才会真正写入文件。
      这样做是避免频繁的操作硬盘,导致效率下降(攒一堆一次性写磁盘效率高)。

    4. 文件的追加

    #1.打开文件,通过a模式打开即可
    f = open("D:/python.txt", "a", encoding="utf-8")
    #2.文件写入
    f.write("你好hhhh")#如果想要换行追加,可以用\n
    #3.内容刷新
    f.flush()
    #...
    #f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    注意:
    a模式:若文件不存在,会创建文件;若文件存在,会在最后追加写入。

    5. 文件操作综合案例

    需求:有一份账单文件,记录了消费收入的具体记录,内容如下:
    name,date,money,type,remarks
    tom,2022-01-01,100000,消费,正式
    tom,2022-01-02,300000,收入,正式
    tom,2022-01-03,100000,消费,测试
    jerry,2022-01-01,200000,收入,正式
    jerry,2022-01-02,100000,消费,测试
    jerry,2022-01-03,100000,消费,正式
    jerry,2022-01-04,100000,消费,测试
    jerry,2022-01-05,500000,收入,正式
    jack,2022-01-01,100000,消费,正式
    jack,2022-01-02,500000,收入,正式
    jack,2022-01-03,900000,收入,测试
    smith,2022-01-01,500000,消费,正式
    smith,2022-01-02,300000,消费,测试
    smith,2022-01-03,950000,收入,正式
    sandy,2022-01-01,300000,消费,测试
    sandy,2022-01-02,100000,消费,正式
    sandy,2022-01-03,300000,消费,正式

    可以将内容身制并保存为bil1.txt文件。我们现在要做的就是:
    (1)读取文件
    (2)将文件写出到bill.txt.bak文件作为备份
    (3)同时,将文件内标记为测试的数据行丢弃

    fr = open("D:/bill.txt", "r", encoding="utf-8")
    fw = open("D:/bill.txt.bak", "w", encoding="utf-8")
    fw.write(fr.readline())#写入第一行
    for line in fr:
        if line.strip().endswith("正式"):#以“正式”结尾
            fw.write(line)
    
    fr.close()
    fw.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    bill.txt.bak 文件写入结果:
    在这里插入图片描述

    bug 记录:
    文件路径写成 D:\bill.txt 会报错,写成 D:/bill.txtD:\bill.txt 就不报错。
    原因:转义字符问题,计算机认为路径中的 “\b” 有歧义。类似的还有 \r、\t 等。

    在这里插入图片描述

    上述问题的其他解决方法:

    路径字符串前加 “r”,如:r"D:\bill.txt"
    原理:使路径中的转义字符失效, "\"只代表一个普通的字符。

  • 相关阅读:
    aws lakeformation工作流程和权限管理逻辑
    【面试 - 八股文】Linux 高频面试题,助你吊打面试官系列
    Spark中广播的使用
    【LeetCode19. 删除链表的倒数第 N 个结点】——链表,快慢双指针,虚拟头结点、利用栈
    Rust China Hackathon 2022 达坦科技组空中宣讲会来啦!
    java程序国际化[38]
    什么是重放攻击(Reply attack)?
    18. `bs对象.节点名.next_sibling` previous_sibling 获取兄弟节点
    C++ 中的模板函数简介
    一招解决windows电脑禁用笔记本自带键盘问题
  • 原文地址:https://blog.csdn.net/qq_44378854/article/details/126510449