Python文件操作:轻松掌握读写技巧

Python基础:文件操作



在 Python 中,文件操作是一项基础且重要的技能,主要涉及文件的打开、读取、写入、关闭等操作。下面我们来了解一下文件操作的基础知识。

一、知识点详解

1.1 文件打开与关闭

在 Python 中,使用内置函数 open() 打开文件,使用 close() 关闭文件。
文件使用完毕后必须关闭,否则会占用系统资源,所以二者一般需配套使用。

open()函数基本语法:open(file, mode='r', encoding=None)
核心参数:
file(必需):文件路径(字符串)
mode(可选):文件的打开模式,默认'r'(读取模式)
encoding(可选):文件的编码格式(默认 None,仅文本模式适用),常用编码:'utf-8''gbk''ascii'

示例:

# 打开文件(如果文件不存在,会报错)
file = open('example.txt', 'r', encoding="utf-8")  # 'r' 表示读取模式

# 使用文件...

# 关闭文件
file.close()

安全写法(使用 with 语句):
with语句:执行文件操作后自动关闭文件释放内存(as 别名 == 起别名)

# with语句基本语法
with open(file, mode, encoding="utf-8") as 别名:
    # 在 with 代码块内使用文件
    # 文件会在代码块结束后自动关闭
    pass

文件两种路径的两种表示方法
绝对路径:完整的磁盘路径,如C:\Users\user\file.txt
相对路径:相对于当前工作目录的路径,.表示当前目录,..表示上级目录
注意
绝对路径中反斜杠(\)需转义或使用原始字符串(r'path')

# 正确写法(转义)
open('C:\\Users\\user\\file.txt', 'r', encoding="utf-8")  
# 或原始字符串
open(r'C:\Users\user\file.txt', 'r', encoding="utf-8")  

1.2 文件打开模式

open() 函数的第二个参数 mode 用于指定文件的打开模式:

模式说明文本模式二进制模式指针(光标)位置文件不存在时文件存在时
r读取rrb文件开头❌ 报错✅ 打开
w写入wwb文件开头(覆盖)✅ 创建新文件✅ 清空内容
a追加aab文件末尾✅ 创建新文件✅ 保留内容
x新建(排他创建)xxb文件开头✅ 创建新文件❌ 报错(FileExistsError)
+读写模式(需与其他模式组合)r+, w+, a+rb+, wb+, ab+取决于组合模式取决于组合模式取决于组合模式

模式组合说明

  1. 读写模式(+
    r+:读取 + 写入,指针(光标)初始在文件开头。
    w+:写入 + 读取,会清空文件内容
    a+:追加 + 读取,指针初始在文件末尾。

  2. 文本模式 vs 二进制模式
    文本模式(默认):处理字符串,自动转换换行符(如 \r\n\n)。
    二进制模式(带 b):处理字节(bytes 对象),用于非文本文件(如图像、音频、视频)。

示例:

# 写入模式(覆盖已有内容)
with open('example.txt', 'w', encoding="utf-8") as file:
    file.write('你好呀, 今天天气晴朗!')

# 追加模式(不覆盖已有内容)
with open('example.txt', 'a', encoding="utf-8") as file:
    file.write('\n这里新起一行插入内容.')

# 二进制读取模式(用于非文本文件)
with open('image.jpg', 'rb') as file:
    data = file.read()

注意:二进制模式(rb)处理字节流,不涉及字符编码,指定encoding会报错

1.3 文件读取操作

打开文件后,可以使用以下方式读取内容:

read()函数:读取整个文件内容

# 读取整个文件内容
with open('example.txt', 'r', encoding="utf-8") as file:
    content = file.read()  # 读取整个文件内容到一个字符串
    print(content)

# 按 字节(二进制文件) / 字符(文本文件) 读取
with open('example.txt', 'r', encoding='utf-8') as file:  
	# 先读取 5 个字符,用于下面循环语句判断
    chunk = file.read(5)  # 这里的 read(5) 代表读取 5个字符
    while chunk:
        print(chunk.strip())  # strip() 去除行末的换行符
        chunk = file.read(5)  # 更新chunk的值,用于循环读取文件所有内容

注意:在Python中,空格,制表符 \t,换行符 \n,回车符 \r等都属于空白字符,若这些字符在字符串开头和结尾时,可以使用字符串的strip() 方法去除

readline()函数:逐行读取文件内容,每次调用读取文件的一行内容
readlines()函数:一次性读取所有行,返回一个列表,每行作为一个元素

# 逐行读取文件内容

# 方法1:使用 readline() 逐行读取文件内容 
with open('example.txt', 'r', encoding="utf-8") as file:
    line = file.readline()  # 读取第一行
    while line:
        print(line.strip())  # strip() 去除行末的换行符
        line = file.readline()  # 读取下一行

# 方法2:使用 readlines() 返回包含所有行的列表
with open('example.txt', 'r', encoding="utf-8") as file:
    lines = file.readlines()
    for line in lines:
        print(line.strip())  # strip() 去除行末的换行符

# 方法3:直接遍历文件对象(更高效)
with open('example.txt', 'r', encoding="utf-8") as file:
    file.seek(0)  # 将文件指针重置到开头
    for line in file:  # 文件对象本身就是可迭代的
        print(line.strip())

1.4 文件写入操作

使用 write()writelines() 方法写入内容:

# 写入字符串
with open("example.txt", "w", encoding="utf-8") as file:
    file.write("今天星期二\n")  # \n 表示换行
    file.write("我们今天学习文件操作...\n")

# 写入多行(列表)
lines = ["\n插入第一行\n", "插入第二行\n", "插入第三行\n"]
with open("example.txt", "a+", encoding="utf-8") as file:
    file.writelines(lines)  # 注意:不会自动添加换行符,需要手动添加

1.5 文件指针操作

文件指针(光标)指示当前读写的位置,可以使用 seek()tell() 方法操作:

  • file.seek(offset, whence=0):移动文件指针到指定位置
    offset:偏移量(字节数)
    whence:参考点(0=文件开头,1=当前位置,2=文件末尾,默认为0)
    注意:文本文件中只能使用whence=0,二进制文件可使用所有参考点

  • file.tell():返回当前指针位置(字节偏移量)
    注意
    文本文件中返回值可能与字符位置不一致(utf-8中一个中文字符占3个字节数)
    返回值适合作为seek()的参数

示例:

with open("example.txt", "r", encoding="utf-8") as file:
    # 读取前5个字符
    print(file.read(5))  # 输出: 今天星期二

    # 获取当前指针位置
    # utf-8中文字符占3字节
    print(file.tell())  # 输出: 15

    # 将指针移动到文件开头
    file.seek(0)
    # 读取一行(从头开始)
    print(file.readline())  # 输出: 今天星期二
    print(file.tell())  # 输出: 17
    # 这里为什么输出 17 ?
    print(len("\n"))  # 输出: 1
    # "\n"不是应该占用 1个字节么
    # 15(中文字节) + 1(\n字节) = 16 

为什么输出 17 ?
Windows文本模式下:
写入时:\n → 自动转 \r\n(+1字节)
读取时:\r\n → 自动转 \n(但消耗2字节)
UTF-8中文字占3字节 + Windows换行符占2字节 → 5中文字+换行符 = 17字节

1.6 文件操作异常处理

文件操作可能会出现异常(如文件不存在、权限不足等),建议使用 try-except 捕获异常:

try:
    with open('nonexistent.txt', 'r', encoding="utf-8") as file:
        content = file.read()
except FileNotFoundError:
    print("错误:文件不存在!")
except PermissionError:
    print("错误:没有访问权限!")
except Exception as e:
    print(f"错误:发生未知异常 - {e}")

二、 应用示例

# 读取文件并统计行数
try:
    with open('example.txt', 'r') as file:
        lines = file.readlines()
        print(f"文件共有 {len(lines)} 行。")
        
        # 统计包含特定关键词的行数
        keyword = 'test'
        count = sum(1 for line in lines if keyword in line)
        print(f"包含 '{keyword}' 的行有 {count} 行。")
except FileNotFoundError:
    print("文件不存在,请检查路径。")

三、知识点总结

  1. 文件打开与关闭
    open(file, mode, encoding)打开文件,mode默认'r'(读),encoding用于文本模式(如utf-8
    必须关闭文件,推荐用with语句自动释放资源,避免忘记调用close()
    路径需注意转义(\\)或原始字符串(r''),区分绝对路径(完整路径)和相对路径(.当前目录)

  2. 文件打开模式
    r(读):文件不存在报错,从开头读取
    w(写):清空文件或创建新文件,覆盖写入
    a(追加):从末尾写入,保留原内容,文件不存在则创建
    x(新建):文件存在则报错(排他性创建)
    +(读写):如r+(读写,开头)、a+(追加+读,需手动移动指针)
    二进制模式(带b:处理字节流(如图像),不涉及编码,用rb/wb/ab

  3. 文件读取操作
    read():读取全部内容为字符串,可指定字符数(文本)或字节数(二进制)
    readline():逐行读取,返回单行字符串(含\n
    readlines():读取所有行,返回列表(每行一个元素)
    遍历文件对象for line in file更高效,自动逐行读取

  4. 文件写入操作
    write(string):写入字符串,\n需手动添加换行
    writelines(lines):写入字符串列表,不自动添加换行符,需手动处理
    写入模式(w/a):w清空文件,a从末尾追加

  5. 文件指针操作
    seek(offset, whence):移动指针,whence=0(开头,文本模式唯一支持)、1(当前位置)、2(末尾,仅二进制可用)
    tell():返回当前指针位置(字节数),文本中需注意中文字符占3字节(UTF-8)、Windows换行符占2字节(\r\n

  6. 文件操作异常处理
    try-except捕获常见异常:
    FileNotFoundError(文件不存在)、PermissionError(权限不足)
    通用Exception捕获其他未知错误,增强程序的稳定性

  7. 注意事项
    优先用with语句管理文件,确保关闭
    明确模式用途:r读、w覆盖写、a追加、b二进制、+读写组合
    大文件避免用read()/readlines(),改用逐行遍历
    二进制文件不指定encoding,文本路径注意转义


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值