0

0

python中如何读取和写入文件_Python文件读写操作指南

下次还敢

下次还敢

发布时间:2025-09-12 17:39:01

|

847人浏览过

|

来源于php中文网

原创

Python文件读写推荐使用with语句,因它能自动关闭文件、确保异常安全且代码更简洁;结合open()函数指定文件路径、模式和encoding参数可高效处理不同编码的文本,避免乱码与资源泄漏。

python中如何读取和写入文件_python文件读写操作指南

Python中处理文件读写,核心在于使用内置的

open()
函数来打开文件,然后通过返回的文件对象调用
read()
write()
等方法进行操作,最后别忘了关闭文件。不过,更推荐的做法是利用
with
语句,它能确保文件在操作结束后,无论是否发生异常,都能被妥善关闭,这在我看来,是Python文件I/O最优雅也最安全的设计之一。

解决方案

在Python里,文件读写操作其实挺直观的,但有些细节,比如文件模式和编码,需要特别注意。

1. 打开文件:

open()
函数

这是所有文件操作的起点。

open()
函数至少需要两个参数:文件路径和打开模式。

立即学习Python免费学习笔记(深入)”;

# 示例:以只读模式打开一个文件
file_object = open('my_document.txt', 'r', encoding='utf-8')
# 稍后会讲到with语句,这只是一个基本演示

常见的模式有:

  • 'r'
    (read): 只读模式,文件必须存在。这是默认模式。
  • 'w'
    (write): 写入模式,如果文件不存在则创建,如果文件已存在则会清空文件内容。
  • 'a'
    (append): 追加模式,如果文件不存在则创建,如果文件已存在则在文件末尾追加内容。
  • 'x'
    (exclusive creation): 独占创建模式,如果文件已存在则会抛出
    FileExistsError
  • 'b'
    (binary): 二进制模式,与
    'r'
    ,
    'w'
    ,
    'a'
    等结合使用,如
    'rb'
    ,
    'wb'
  • 't'
    (text): 文本模式,与
    'r'
    ,
    'w'
    ,
    'a'
    等结合使用,如
    'rt'
    ,
    'wt'
    。这是默认模式。
  • '+'
    (update): 更新模式,与
    'r'
    ,
    'w'
    ,
    'a'
    等结合使用,表示既可读又可写,如
    'r+'
    ,
    'w+'

2. 读取文件

文件对象提供了多种读取方法:

  • read(size=-1)
    : 读取文件全部内容作为一个字符串(文本模式)或字节串(二进制模式)。如果指定
    size
    ,则读取指定数量的字符或字节。
  • readline(size=-1)
    : 读取文件的一行。
  • readlines()
    : 读取所有行,并返回一个字符串列表,每个元素是一行。
# 假设我们有一个名为 'example.txt' 的文件,内容如下:
# Hello, Python!
# This is a test file.
# Line three.

# 使用with语句读取文件内容,这是我个人最推荐的方式
with open('example.txt', 'r', encoding='utf-8') as f:
    content = f.read() # 读取所有内容
    print("全部内容:\n", content)

print("-" * 20)

with open('example.txt', 'r', encoding='utf-8') as f:
    first_line = f.readline() # 读取第一行
    second_line = f.readline() # 读取第二行
    print("第一行:", first_line.strip()) # .strip()去除末尾的换行符
    print("第二行:", second_line.strip())

print("-" * 20)

with open('example.txt', 'r', encoding='utf-8') as f:
    all_lines = f.readlines() # 读取所有行到列表中
    print("所有行列表:", [line.strip() for line in all_lines])

3. 写入文件

  • write(string)
    : 将字符串(文本模式)或字节串(二进制模式)写入文件。
  • writelines(list_of_strings)
    : 将字符串列表写入文件,不会自动添加换行符,需要手动添加。
# 写入文件
with open('new_file.txt', 'w', encoding='utf-8') as f:
    f.write("这是新写入的第一行。\n")
    f.write("这是第二行内容。\n")
    print("内容已写入 new_file.txt")

# 追加内容到文件
with open('new_file.txt', 'a', encoding='utf-8') as f:
    f.write("这是追加进来的第三行。\n")
    print("内容已追加到 new_file.txt")

# 使用writelines写入多行
lines_to_write = [
    "列表写入的第一行。\n",
    "列表写入的第二行。\n"
]
with open('another_file.txt', 'w', encoding='utf-8') as f:
    f.writelines(lines_to_write)
    print("列表内容已写入 another_file.txt")

4. 文件的关闭

如果你不使用

with
语句,那么在文件操作完成后,务必调用
file_object.close()
来关闭文件。这能释放系统资源,并确保所有缓存的数据都被写入磁盘。忘记关闭文件可能导致数据丢失或资源泄漏。

# 不推荐但需要了解的关闭方式
f = open('temp.txt', 'w')
f.write("临时内容")
f.close() # 必须手动关闭

Python文件操作中,为何推荐使用
with
语句?它有什么优势?

说实话,

with
语句简直是Python在文件操作上的一大福音,我个人一直觉得它是处理资源管理问题的典范。它的核心优势在于提供了一个上下文管理器协议,确保资源(在这里是文件)在使用完毕后,无论程序执行过程中是否遇到错误,都能被正确地关闭和释放。

具体来说,

with open(...) as f:
这种写法,它的魔力在于:

  1. 自动关闭文件:这是最显著的优点。当你退出
    with
    代码块时,Python会自动调用文件对象的
    __exit__
    方法,从而自动关闭文件,你完全不用担心忘记
    f.close()
    可能带来的资源泄漏问题。这对于新手或者在复杂逻辑中处理文件时,大大降低了出错的概率。
  2. 异常安全:即使在
    with
    代码块内部发生了异常,文件也会在异常传播出去之前被关闭。这意味着你的文件不会因为程序崩溃而保持打开状态,从而避免了文件损坏或锁定等问题。这在我看来,是编写健壮代码不可或缺的一部分。
  3. 代码更简洁:相比于传统的
    try...finally
    结构来确保文件关闭,
    with
    语句显然更加简洁、易读。它把资源管理的逻辑封装起来,让开发者可以更专注于业务逻辑本身。

举个例子,如果没有

with

f = open('data.txt', 'r')
try:
    content = f.read()
    # 假设这里发生了一个错误,比如除零错误
    result = 1 / 0
except Exception as e:
    print(f"发生错误: {e}")
finally:
    f.close() # 无论如何都会执行

而有了

with

try:
    with open('data.txt', 'r') as f:
        content = f.read()
        # 假设这里发生了一个错误
        result = 1 / 0
except Exception as e:
    print(f"发生错误: {e}")
# 文件在这里已经自动关闭了,即使发生了异常

显然,

with
语句让代码更干净,更安全,也更符合Python的“优雅”哲学。

处理大型文件时,Python有哪些高效的读取策略?

处理大文件,我个人经验是,千万别想着一口气把所有内容都读进来,除非你确定文件很小或者你的内存足够大到可以装下几个这样的文件。那样做,轻则程序卡顿,重则直接内存溢出(MemoryError),程序崩溃。高效处理大文件的关键在于“流式”读取,也就是一次只读取文件的一部分,处理完这部分再读取下一部分。

Python提供了几种非常实用的策略:

寻鲸AI
寻鲸AI

寻鲸AI是一款功能强大的人工智能写作工具,支持对话提问、内置多场景写作模板如写作辅助类、营销推广类等,更能一键写作各类策划方案。

下载
  1. 逐行迭代(推荐):这是最常见也是最Pythonic的方法。文件对象本身就是一个迭代器,你可以直接在

    for
    循环中迭代它,每次迭代都会返回文件的一行内容。这种方式非常高效,因为它只在需要时才从磁盘读取一行数据到内存,而不是一次性加载整个文件。

    def process_large_file_line_by_line(filepath):
        line_count = 0
        with open(filepath, 'r', encoding='utf-8') as f:
            for line in f: # f本身就是行迭代器
                # 这里处理每一行数据
                # print(f"处理行: {line.strip()}")
                line_count += 1
                if line_count % 100000 == 0: # 每10万行打印一次进度
                    print(f"已处理 {line_count} 行...")
        print(f"文件 '{filepath}' 处理完毕,共 {line_count} 行。")
    
    # 假设有一个很大的文件 'large_data.txt'
    # process_large_file_line_by_line('large_data.txt')

    这种方式的内存占用非常小,只与当前处理的行长度有关。

  2. 分块读取(

    read(size)
    :如果你处理的不是基于行的文本文件,而是二进制文件或者需要按固定大小块处理的文本文件,那么可以使用
    read(size)
    方法。每次读取
    size
    个字节或字符,直到文件末尾。

    def process_large_binary_file_in_chunks(filepath, chunk_size=4096):
        total_bytes_read = 0
        with open(filepath, 'rb') as f: # 注意是二进制模式
            while True:
                chunk = f.read(chunk_size)
                if not chunk: # 读取到文件末尾
                    break
                # 这里处理读取到的chunk数据
                # print(f"读取到 {len(chunk)} 字节的块")
                total_bytes_read += len(chunk)
                # 示例:写入到一个新文件
                # with open('output_binary.bin', 'ab') as out_f:
                #     out_f.write(chunk)
        print(f"文件 '{filepath}' 处理完毕,共读取 {total_bytes_read} 字节。")
    
    # process_large_binary_file_in_chunks('large_image.bin')

    这种方法适合处理非结构化的数据流,或者当你需要精确控制每次从磁盘读取的数据量时。

  3. 使用

    fileinput
    模块:对于需要处理多个文件,或者从标准输入读取的场景,
    fileinput
    模块提供了一个方便的接口,它也可以逐行处理文件,用法类似于文件对象的迭代。

这些策略的核心思想都是避免一次性加载整个文件到内存,从而有效地管理内存使用,确保程序在大文件面前依然稳定高效。

Python在不同文件编码(如UTF-8、GBK)之间如何处理?

编码问题,说实话,是文件操作里最让人头疼的“隐形杀手”之一。很多时候,文件读写出了问题,程序报错

UnicodeDecodeError
UnicodeEncodeError
,十有八九就是编码没处理对。Python 3对Unicode支持得很好,但前提是你得告诉它文件是用什么编码保存的。

1.

open()
函数的
encoding
参数

这是解决编码问题的核心。在

open()
函数中,你可以通过
encoding
参数明确指定文件的编码格式。

  • 读取文件时:你需要告诉Python这个文件是用什么编码保存的,这样Python才能正确地将其中的字节序列解码成Unicode字符串。如果指定错误,就会出现

    UnicodeDecodeError

      # 假设 'gbk_file.txt' 是一个用GBK编码保存的文件
      # 内容是:你好,世界!
      try:
          with open('gbk_file.txt', 'r', encoding='gbk') as f:
              content = f.read()
              print(f"成功读取GBK文件: {content}")
      except UnicodeDecodeError as e:
          print(f"读取GBK文件失败,编码错误: {e}")
    
      # 如果用错误的编码(比如UTF-8)去读GBK文件,就会报错
      try:
          with open('gbk_file.txt', 'r', encoding='utf-8') as f:
              content = f.read()
              print(f"错误读取UTF-8文件: {content}")
      except UnicodeDecodeError as e:
          print(f"预期错误:尝试用UTF-8读取GBK文件导致解码失败: {e}")
  • 写入文件时:你需要告诉Python你想用什么编码来保存你的Unicode字符串到文件。如果你的字符串包含目标编码不支持的字符,或者你指定了错误的编码,可能会出现

    UnicodeEncodeError

      # 写入一个UTF-8编码的文件
      with open('utf8_output.txt', 'w', encoding='utf-8') as f:
          f.write("Hello, 世界!这是UTF-8编码的文本。")
          print("UTF-8文件写入成功。")
    
      # 尝试写入一个GBK编码的文件,但内容可能超出GBK的字符集范围
      # GBK不支持某些生僻字,但对于常用汉字是没问题的
      with open('gbk_output.txt', 'w', encoding='gbk') as f:
          f.write("你好,Python!这是GBK编码的文本。")
          print("GBK文件写入成功。")
    
      # 如果写入的字符在GBK中不存在,且没有指定错误处理,就会报错
      try:
          with open('gbk_output_error.txt', 'w', encoding='gbk') as f:
              # 假设这个字符 '?' 在GBK中没有对应的编码
              f.write("这是一个表情符号?,GBK可能无法编码。")
      except UnicodeEncodeError as e:
          print(f"写入GBK文件失败,编码错误: {e}")
          print("可以通过指定 errors 参数来处理,例如 errors='ignore' 或 errors='replace'")

2. 默认编码和系统编码

如果你不指定

encoding
参数,Python会使用系统默认的编码。在Windows上这通常是GBK(或cp936),在Linux/macOS上通常是UTF-8。这也就是为什么在不同系统间传输文件,或者在同一系统上使用不同工具编辑文件时,经常会遇到乱码问题。明确指定编码是一个好习惯,可以避免很多跨平台或跨工具的兼容性问题。

3. 错误处理:

errors
参数

当遇到无法解码或编码的字符时,

encoding
参数还可以配合
errors
参数来指定错误处理策略:

  • 'strict'
    (默认): 遇到编码错误时抛出
    UnicodeDecodeError
    UnicodeEncodeError
  • 'ignore'
    : 忽略无法编码/解码的字符。
  • 'replace'
    : 用一个替换字符(通常是
    ?
    )代替无法编码/解码的字符。
  • 'backslashreplace'
    : 用Python的Unicode转义序列(
    \xhh
    \uxxxx
    )替换无法编码/解码的字符。
# 示例:使用 errors 参数
with open('gbk_output_error_handled.txt', 'w', encoding='gbk', errors='replace') as f:
    f.write("这是一个表情符号?,GBK可能无法编码。但我们用替换策略。")
print("写入GBK文件,并用'replace'策略处理了编码错误。")

总而言之,处理编码问题,最关键的就是明确、一致。知道你的文件是用什么编码保存的,并在

open()
函数中如实地告诉Python,这是避免乱码和错误的不二法门。

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

778

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

685

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

769

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

739

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1445

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

571

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

580

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

752

2023.08.11

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

25

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.8万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号