26期_01_Pyhton文件的操作

Python文件操作超详细教程:从编码到实战案例

文件操作是Python编程中处理数据持久化存储的核心技能。本文将系统讲解文件的编码、读取、写入、追加等操作,并通过账单备份实战案例帮助大家彻底掌握文件处理技巧。

一、文件编码:数据存储的基础

1.1 为什么需要文件编码?

核心问题:计算机只能识别0和1,那么丰富的文本文件如何被计算机识别并存储在硬盘中?

答案:使用编码技术(类似密码本)将内容翻译成0和1进行存储。

1.2 什么是文件编码?

编码技术即翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容。

常见的编码格式

  • UTF-8(最常用,全球通用)

  • GBK

  • Big5

  • 等其他编码

不同的编码将内容翻译成二进制也是不同的,因此必须使用正确的编码才能正确读写文件。

1.3 编码的重要性

如果发送方使用编码A进行编码,接收方使用编码B进行解码,就会出现乱码问题。因此统一的编码标准至关重要。

1.4 查看和选择编码

查看文件编码:使用Windows记事本打开文件,右下角显示编码格式(如UTF-8)

编码选择建议

  • UTF-8是目前全球通用的编码格式

  • 除非有特殊需求,否则一律使用UTF-8格式进行文件编码

1.5 编码总结

  1. 什么是编码:编码就是一种规则集合,记录了内容和二进制间进行相互转换的逻辑

  2. 为什么需要编码:计算机只认识0和1,需要编码进行翻译转换

  3. 推荐编码:UTF-8编码

二、文件读取操作详解

2.1 文件的基本概念

什么是文件:内存中的数据在关机后消失,要长久保存数据就需要使用文件。文件是操作系统管理磁盘数据的基本单位。

文件分类:文本文件、视频文件、音频文件、图像文件、可执行文件等。

2.2 文件操作三步走

对文件的基本操作可以分为三个步骤:

  1. 打开文件

  2. 读写文件

  3. 关闭文件

注意:可以只打开和关闭文件,不进行任何读写操作。

2.3 open()打开函数

基本语法

复制代码
open(name, mode, encoding)

参数说明

  • name:要打开的目标文件名(可以包含具体路径)

  • mode:打开文件的模式(只读、写入、追加等)

  • encoding:编码格式(推荐UTF-8)

示例代码

这里的 ""r"" 代表原始字符串,不然还得使用转义字符

python 复制代码
f = open(r"F:\26_01\python\test\文件.txt",'r',encoding="utf-8")

print(f.read())

重要提示:encoding参数需要用关键字参数指定,不能依赖位置参数。

2.4 常用的三种访问模式

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

2.5 读取文件的方法

read()方法:读取指定长度内容
复制代码
文件对象.read(num)
  • num表示要读取的数据长度(单位是字节)

  • 不传入num则读取文件中所有数据

readlines()方法:按行读取全部内容
python 复制代码
f = open('python.txt')
content = f.readlines()
# ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc']
print(content)
f.close()
  • 返回一个列表,每行数据为一个元素
readline()方法:一次读取一行
python 复制代码
f = open('python.txt')
content = f.readline()
print(f'第一行: {content}')
content = f.readline() 
print(f'第二行: {content}')
f.close()
for循环逐行读取

这种方式循环结束会自动关闭文件

python 复制代码
for line in open("python.txt", "r"):
    print(line)
# 每一个line临时变量记录了文件的一行数据

2.6 关闭文件的重要性

python 复制代码
f = open("python.txt", "r")
f.close()

# 不调用close(),文件将一直被Python程序占用
with open语法
python 复制代码
with open("python.txt", "r") as f:
    content = f.readlines()
# 操作完成后自动关闭文件,避免遗忘close()

2.7 读取操作汇总

操作 功能
文件对象 = open(file, mode, encoding) 打开文件获得文件对象
文件对象.read(num) 读取指定长度字节,不指定num读取文件全部
文件对象.readline() 读取一行
文件对象.readlines() 读取全部行,得到列表
for line in 文件对象 for循环文件行,一次循环得到一行数据
文件对象.close() 关闭文件对象
with open() as f 通过with open语法打开文件,可以自动关闭

2.8 读取操作总结

  1. 操作文件需要通过open函数打开文件得到文件对象

  2. 文件对象有4种读取方法:read()、readline()、readlines()、for循环

  3. 文件读取完成后要使用close()方法关闭文件对象

  4. 推荐使用with open语法,自动管理文件关闭

2.9 练习:单词计数

需求:读取word.txt文件,统计"itheima"单词出现的次数

文件内容

python 复制代码
itheima itcast python
itheima python itcast
beijing shanghai itheima
shenzhen guangzhou itheima
wuhan hangzhou itheima
zhengzhou bigdata itheima

参考实现

python 复制代码
f = open(r"F:\26_01\python\test\文件.txt", 'r', encoding="utf-8")
count = 0
my_list = f.readlines()

for x in my_list:
    x = x.strip()  # 新增:去除换行符和空格
    if x == "":  # 检查是否为空行
        continue
    danci_list = x.split(" ")
    for y in danci_list:
        if y == "itheima":
            count += 1
            print(count)

print("最终统计:", count)
f.close()

注意:处理换行符

方法1:在分割前去除换行符(推荐)

修改代码,在分割单词前使用 strip()去除每行的首尾空白符(包括换行符):

python 复制代码
f = open(r"F:\26_01\python\test\文件.txt", 'r', encoding="utf-8")
count = 0
my_list = f.readlines()

for x in my_list:
    x = x.strip()  # 新增:去除换行符和空格
    if x == "":  # 检查是否为空行
        continue
    danci_list = x.split(" ")
    for y in danci_list:
        if y == "itheima":
            count += 1
            print(count)

print("最终统计:", count)
f.close()

方法2:使用 split()替代 split(" ")

split()默认按任意空白符(包括空格、换行符等)分割,并自动去除空元素:

python 复制代码
for x in my_list:
    if x.strip() == "":
        continue
    danci_list = x.split()  # 无参数,自动处理空白符
    for y in danci_list:
        if y == "itheima":
            count += 1

方法3:在比较前清理单词

直接处理每个单词的换行符

python 复制代码
for y in danci_list:
    y = y.strip()  # 清理单词的换行符
    if y == "itheima":
        count += 1

三、文件写入操作详解

3.1 写入操作快速入门

python 复制代码
# 1. 打开文件
f = open('python.txt', 'w')

# 2. 文件写入
f.write('hello world')

# 3. 内容刷新
f.flush()

重要机制

  • 直接调用write(),内容积攒在程序内存中(缓冲区)

  • 调用flush()时,内容真正写入文件

  • 这种机制避免频繁操作硬盘,提高效率

3.2 写入操作注意事项

  • 文件不存在:使用"w"模式会创建新文件

  • 文件存在:使用"w"模式会清空原有内容

3.3 写入操作总结

  1. 写入文件使用open函数的"w"模式

  2. 写入方法:write()写入内容,flush()刷新到硬盘

  3. 注意事项:w模式会创建新文件或清空已有文件

  4. close()方法自带flush()功能

四、文件追加操作详解

4.1 追加写入快速入门

python 复制代码
# 1. 打开文件,通过a模式打开
f = open('python.txt', 'a')

# 2. 文件写入
f.write('hello world')

# 3. 内容刷新
f.flush()

追加模式特点

  • 文件不存在:创建新文件

  • 文件存在:在文件末尾追加内容

  • 可以使用"\n"写入换行符

4.2 追加操作总结

  1. 追加写入使用open函数的"a"模式

  2. 写入方法与w模式一致

  3. 注意事项:a模式在文件末尾追加内容

扩展:b模式

五、文件操作综合案例:账单备份

5.1 需求分析

原始账单文件(bill.txt)内容

复制代码
name,date,money,type,remarks
周杰轮,2022-01-01,100000,消费,正式
周杰轮,2022-01-02,300000,收入,正式
周杰轮,2022-01-03,100000,消费,测试
林俊节,2022-01-01,300000,收入,正式
林俊节,2022-01-02,100000,消费,测试
林俊节,2022-01-03,100000,消费,正式
(后续数据省略...)

任务要求

  1. 读取bill.txt文件

  2. 将文件写出到bill.txt.bak作为备份

  3. 丢弃标记为"测试"的数据行

5.2 实现思路

  1. 使用open和r模式打开源文件对象

  2. 使用open和w模式打开目标文件对象

  3. for循环读取每行内容

  4. 判断remarks字段是否为"测试"

  5. 不是测试就write写出,是测试就跳过

  6. 关闭两个文件对象

5.3 完整代码实现

python 复制代码
#读的文件
f = open(r"F:\26_01\python\test\bill.txt", 'r', encoding="utf-8")
#写的文件
t = open(r"F:\26_01\python\test\bill02.txt", 'w', encoding="utf-8")
#操作
for typr in f.readlines():
    #去除前后的空格,以及换行符
    typr = typr.strip()
    #判断是否为空
    if typr == " ":
        continue
    typr_list = typr.split(",")
    #防止索引越界
    if len(typr_list) <5:
        t.write(typr + "\n")
        continue
    if "测试" == typr_list[4]:
        continue
    t.write(typr+"\n")
#关闭管道
f.close()
t.close()

5.4 代码优化版本

python 复制代码
def backup_bill_file(source_path, backup_path):
    """
    备份账单文件并过滤测试数据
    :param source_path: 源文件路径
    :param backup_path: 备份文件路径
    """
    try:
        with open(source_path, 'r', encoding='UTF-8') as source_file:
            with open(backup_path, 'w', encoding='UTF-8') as backup_file:
                # 写入表头
                header = source_file.readline()
                backup_file.write(header)
                
                # 处理数据行
                for line in source_file:
                    line = line.strip()
                    if not line:
                        continue
                    
                    parts = line.split(',')
                    if len(parts) >= 5 and parts[4] != '测试':
                        backup_file.write(line + '\n')
                        
        print(f"备份成功!文件已保存至: {backup_path}")
        
    except FileNotFoundError:
        print("错误:源文件不存在!")
    except Exception as e:
        print(f"处理文件时发生错误: {e}")

# 使用函数
backup_bill_file('bill.txt', 'bill.txt.bak')

六、文件操作最佳实践

6.2 大文件读取优化

对于大文件,避免一次性读取全部内容:

python 复制代码
# 不好的做法:一次性读取大文件
with open('large_file.txt', 'r') as f:
    content = f.read()  # 可能内存溢出

# 好的做法:逐行或分块读取
with open('large_file.txt', 'r') as f:
    for line in f:  # 逐行处理
        process_line(line)

# 或者分块读取
def read_in_chunks(file_path, chunk_size=1024):
    with open(file_path, 'r') as f:
        while True:
            chunk = f.read(chunk_size)
            if not chunk:
                break
            yield chunk

6.3 文件路径处理

python 复制代码
import os

# 获取当前目录
current_dir = os.getcwd()

# 路径拼接
file_path = os.path.join('data', 'files', 'example.txt')

# 检查文件是否存在
if os.path.exists(file_path):
    print("文件存在")

七、总结

7.1 核心知识点回顾

  1. 文件编码:理解编码概念,统一使用UTF-8编码

  2. 文件读取:掌握多种读取方法及适用场景

  3. 文件写入:理解缓冲区机制,正确使用写入操作

  4. 文件追加:掌握追加模式的应用场景

  5. 实战应用:通过综合案例巩固文件操作技能

7.2 关键注意事项

  • 始终指定正确的文件编码(推荐UTF-8)

  • 使用with open语法自动管理文件关闭

  • 大文件使用逐行或分块读取避免内存问题

  • 写入操作后记得刷新缓冲区或关闭文件

  • 做好异常处理,提高程序健壮性

相关推荐
余瑜鱼鱼鱼2 小时前
线程和进程的区别和联系
java·开发语言·jvm
zzcufo2 小时前
多邻国第五阶段第13部分
java·开发语言·数据库
37方寸2 小时前
前端基础知识(JavaScript)
开发语言·前端·javascript
Whisper_Sy3 小时前
Flutter for OpenHarmony移动数据使用监管助手App实战 - 应用列表实现
android·开发语言·javascript·flutter·php
小CC吃豆子3 小时前
Python爬虫
开发语言·python
机器视觉知识推荐、就业指导3 小时前
Qt 6 所有 QML 类型(官方完整清单 · 原始索引版)
开发语言·qt
June bug3 小时前
(#字符串处理)字符串中第一个不重复的字母
python·leetcode·面试·职场和发展·跳槽
techdashen3 小时前
Rust OnceCell 深度解析:延迟初始化的优雅解决方案
开发语言·oracle·rust
少控科技3 小时前
QT新手日记033
开发语言·qt