找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3432

积分

0

好友

451

主题
发表于 7 天前 | 查看: 30| 回复: 0

一个可爱的卡通风格针织帽,顶部有白色毛球,色彩温馨

本文主要基于Python3版本进行讲解,为你梳理文件操作的核心知识点。

1. 打开文件:open()函数

要对文件进行读写,首先需要打开文件。Python内置的open()函数用于打开一个文件,并返回一个文件对象。其基本语法如下:

file_object = open(file_name, mode, encoding=None)
  • file_name:包含文件路径的字符串(可以是绝对路径或相对路径)。
  • mode:打开文件的模式,决定了你能对文件进行何种操作。
  • encoding:可选参数,仅在文本模式下使用,用于指定文件的编码格式(如‘utf-8’‘gbk’等)。如果不指定,则使用平台默认编码(通常为‘utf-8’,但在Windows上可能为‘gbk’)。建议显式指定encoding='utf-8'以保证跨平台一致性。

常用模式:

模式 描述
‘r’ 只读模式(默认)。读取已存在文件,文件必须存在,否则抛出FileNotFoundError
‘w’ 只写模式。如果文件存在,会覆盖原文件;如果文件不存在,则创建新文件
‘a’ 追加模式。如果文件存在,写入的内容会追加到文件末尾;如果文件不存在,则创建新文件
‘x’ 独占创建模式。如果文件已存在,则抛出FileExistsError;如果不存在,则创建并写入
‘b’ 二进制模式(可与其他模式组合,如‘rb’‘wb'), 处理图片/音频等二进制文件(如 ‘rb’
‘t’ 文本模式(默认,可省略)
‘+’ 读写模式(可与其他模式组合,如‘r+’‘w+’

示例:打开文件

# ①. 以只读方式打开一个文本文件,并指定UTF-8编码
f = open('example.txt', 'r', encoding='utf-8')

# ②. 以二进制写入方式打开一个文件(二进制模式不需要encoding参数)
f_bin = open('data.bin', 'wb')

2. 读取文件

文件打开后,可以使用文件对象的以下方法读取内容。

2.1 read(size)

  • 读取指定字节数的内容。如果不指定sizesize为负数,则读取整个文件内容。
  • 返回字符串(文本模式)或字节串(二进制模式)。
f = open('example.txt', 'r', encoding='utf-8')
content = f.read()      # 读取全部内容
print(content)
f.close()

2.2 readline()

  • 读取一行内容,包括行尾的换行符\n
  • 如果到达文件末尾,返回空字符串 ’’
f = open('example.txt', 'r', encoding='utf-8')
line = f.readline()  # 逐行读取
while line:
    print(line, end='')   # 避免print自动添加换行
    line = f.readline()
f.close()

2.3 readlines()

  • 读取所有行,返回一个字符串列表,每个元素是一行(包含换行符)。
f = open('example.txt', 'r', encoding='utf-8')
lines = f.readlines()
for line in lines:
    print(line, end='')
f.close()

2.4 直接迭代文件对象

  • 文件对象是可迭代的,可以直接在for循环中逐行读取,内存效率高。
f = open('example.txt', 'r', encoding='utf-8')
for line in f:
    print(line, end='')
f.close()

3. 写入文件

写入文件前,需要确保文件以写入模式(‘w’‘a’‘x’‘r+’等)打开。

3.1 write(string)

  • 将字符串写入文件,返回写入的字符数(文本模式)或字节数(二进制模式)。
  • 注意:write()不会自动添加换行符,需要手动添加\n
f = open('output.txt', 'w', encoding='utf-8')
num = f.write(“Hello, World!\n”)
print(f”写入了 {num} 个字符”)
f.close()

3.2 writelines(lines)

  • 写入一个字符串列表,但不会自动添加换行符,列表中的每个字符串应已包含换行符。
lines = [“第一行\n”, “第二行\n”, “第三行\n”]
f = open('output.txt', ‘w’, encoding=‘utf-8’)
f.writelines(lines)
f.close()

注意

  • ‘w’ 模式会覆盖原文件内容(新文件会创建)。
  • 确保每行结尾添加 \n(否则内容会连在一起)。

4. 关闭文件:close()与with语句

4.1 显式关闭

  • 文件操作完成后,必须调用close()方法关闭文件,释放系统资源。
  • 如果忘记关闭,可能导致数据丢失或资源泄露。
f = open('example.txt’, ‘r’, encoding=‘utf-8’)
# 执行读取操作
f.close()

4.2 使用with语句(推荐)

  • with语句会自动管理文件的关闭,避免资源泄露,即使发生异常也会正确关闭文件。比手动调用 close() 更安全。
  • 当文件不存在时,会捕获 FileNotFoundError,避免程序崩溃。
  • 语法:with open(...) as file_object:
with open('example.txt’, ‘r’, encoding=‘utf-8’) as f:
    content = f.read()
    print(content)
# 离开with块后,文件自动关闭

5. 文件指针操作

文件对象内部维护一个指针,指示当前读写的位置。

5.1 tell():返回当前指针位置(字节数)。

5.2 seek(offset, whence):移动指针。

  • offset:偏移量。
  • whence:可选,0表示从文件开头计算(默认),1表示从当前位置计算,2表示从文件末尾计算。
with open('example.txt', ‘r’, encoding=‘utf-8’) as f:
    print(f.tell())      # 0
    f.read(5)
    print(f.tell())      # 5
    f.seek(0)            # 回到开头
    print(f.tell())      # 0

6. 异常处理

文件操作可能引发多种异常,例如文件不存在、权限不足、编码错误等。可以使用try...except...finally捕获并处理异常。

try:
    f = open('nonexistent.txt’, ‘r’, encoding=‘utf-8’)
    content = f.read()
except FileNotFoundError:
    print(“文件不存在,请检查路径!”)
except PermissionError:
    print(“没有权限读取文件!”)
except UnicodeDecodeError:
    print(“文件编码错误,请检查encoding参数!”)
except Exception as e:
    print(f”发生未知错误:{e}”)
finally:
    # 确保文件被关闭
    if ‘f’ in locals() and not f.closed:
        f.close()

结合with语句可以简化异常处理,因为with会自动关闭文件。

try:
    with open('nonexistent.txt’, ‘r’, encoding=‘utf-8’) as f:
        content = f.read()
except FileNotFoundError:
    print(“文件不存在!”)
except UnicodeDecodeError:
    print(“文件编码错误!”)

7. 综合示例

下面是一个完整的示例,演示如何读取一个文件的内容,修改后写入另一个文件,并处理可能出现的异常。示例中显式指定了UTF-8编码。

示例:复制文件并添加行号

假设有一个input.txt文件,内容如下(UTF-8编码):

Python is great.
File handling is easy.
Let's learn together.

我们希望生成output.txt,在每一行前添加行号,格式如1: Python is great.

input_file = ‘input.txt’
output_file = ‘output.txt’

try:
    with open(input_file, ‘r’, encoding=‘utf-8’) as infile:
        lines = infile.readlines()

    # 添加行号
    numbered_lines = [f”{i+1}: {line}” for i, line in enumerate(lines)]

    with open(output_file, ‘w’, encoding=‘utf-8’) as outfile:
        outfile.writelines(numbered_lines)

    print(f”处理完成,结果已保存至 {output_file}”)

except FileNotFoundError:
    print(f”错误:文件 {input_file} 不存在,请检查路径。”)
except PermissionError:
    print(“错误:没有权限读写文件。”)
except UnicodeDecodeError:
    print(“错误:文件编码不是UTF-8,请检查源文件编码。”)
except Exception as e:
    print(f”发生未知错误:{e}”)

运行后,output.txt的内容应为:

1: Python is great.
2: File handling is easy.
3: Let's learn together.

8. 涉及的Python语法总结

语法 说明
open(file, mode, encoding) 打开文件,返回文件对象。
file.read([size]) 读取文件内容。
file.readline() 读取一行。
file.readlines() 读取所有行到列表。
file.write(str) 写入字符串。
file.writelines(list) 写入字符串列表。
file.close() 关闭文件。
with open(...) as f: 使用上下文管理器自动关闭文件。
file.tell() 返回当前文件指针位置。
file.seek(offset, whence) 移动文件指针。
try...except...finally 异常处理结构。
for line in file 直接迭代文件对象逐行读取。
文件模式:‘r’, ‘w’, ‘a’, ‘b’, ‘+’ 指定打开文件的模式。

9. 常见错误与解决方案

错误现象 原因 修复方法
UnicodeDecodeError 未指定编码 添加 encoding='utf-8'
文件内容为空 未正确关闭文件 使用 with 语句
写入后内容丢失 未使用 ‘w’‘a’ 模式 确认模式是否正确
文件路径错误 路径不正确(如 ./data/file.txt 使用绝对路径或检查当前工作目录

希望这份详细的Python3文件操作指南能帮助你更好地理解和使用相关功能。如果你想深入探讨更多Python技巧或遇到具体问题,欢迎来 云栈社区 的Python板块交流讨论。




上一篇:告别Daemon负担:以Buildah为例探索轻量、安全的容器镜像构建新范式
下一篇:战略管理赋能人机共生:突破组织僵化的AI时代新范式
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-23 11:43 , Processed in 0.813863 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表