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

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:

这种写法,它的魔力在于:

自动关闭文件:这是最显著的优点。当你退出

with

代码块时,Python会自动调用文件对象的

__exit__

方法,从而自动关闭文件,你完全不用担心忘记

f.close()

可能带来的资源泄漏问题。这对于新手或者在复杂逻辑中处理文件时,大大降低了出错的概率。异常安全:即使在

with

代码块内部发生了异常,文件也会在异常传播出去之前被关闭。这意味着你的文件不会因为程序崩溃而保持打开状态,从而避免了文件损坏或锁定等问题。这在我看来,是编写健壮代码不可或缺的一部分。代码更简洁:相比于传统的

try...finally

结构来确保文件关闭,

with

语句显然更加简洁、易读。它把资源管理的逻辑封装起来,让开发者可以更专注于业务逻辑本身。

举个例子,如果没有

with

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

而有了

with

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

显然,

with

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

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

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

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

逐行迭代(推荐):这是最常见也是最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')

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

分块读取(

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')

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

使用

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文件读写操作指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1371066.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
python中super()函数有什么作用?
上一篇 2025年12月14日 11:06:48
python如何将小写字母转换为大写_python字符串大小写转换方法
下一篇 2025年12月14日 11:06:55

相关推荐

  • composer require-dev和require有什么不同_Composer Require与Require-Dev区别解析

    require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定…

    2026年5月10日
    1000
  • Matplotlib 地图中多类型图例的创建与优化

    Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化

    本教程旨在解决matplotlib地图可视化中,如何在一个图例中同时展示颜色块(如区域分类)和自定义标记(如特定兴趣点)的问题。文章详细介绍了当传统`patch`对象无法正确显示标记时,如何利用`matplotlib.lines.line2d`创建标记图例句柄,并将其与颜色块图例句柄合并,从而生成一…

    2026年5月10日 用户投稿
    900
  • 利用海象运算符简化条件赋值:Python教程与最佳实践

    本文旨在探讨Python中海象运算符(:=)在条件赋值场景下的应用。通过对比传统if/else语句与海象运算符,以及条件表达式,分析海象运算符在简化代码、提高可读性方面的优势与局限性。并通过具体示例,展示如何在列表推导式等场景下合理使用海象运算符,同时强调其潜在的复杂性及替代方案,帮助开发者更好地掌…

    2026年5月10日
    300
  • Debian syslog性能优化技巧有哪些

    提升Debian系统syslog (通常基于rsyslog)性能,关键在于精简配置和高效处理日志。以下策略能有效优化日志管理,提升系统整体性能: 精简配置,高效加载: 在rsyslog配置文件中,仅加载必要的输入、输出和解析模块。 使用全局指令设置日志级别和格式,避免不必要的处理。 自定义模板: 创…

    2026年5月10日
    000
  • 怎么在PHP代码中实现图片上传功能_PHP图片上传功能实现与安全处理教程

    首先创建含enctype的HTML表单,再用PHP接收文件,检查目录、移动临时文件,验证类型与大小,生成唯一文件名,并调整php.ini限制以确保上传成功。 如果您尝试在PHP项目中添加图片上传功能,但服务器无法正确接收或保存文件,则可能是由于表单配置、文件处理逻辑或安全限制的问题。以下是实现该功能…

    2026年5月10日
    300
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • RichHandler与Rich Progress集成:解决显示冲突的教程

    在使用rich库的`richhandler`进行日志输出并同时使用`progress`组件时,可能会遇到显示错乱或溢出问题。这通常是由于为`richhandler`和`progress`分别创建了独立的`console`实例导致的。解决方案是确保日志处理器和进度条组件共享同一个`console`实例…

    2026年5月10日
    300
  • 理解编程指令:当结果正确,但实现方式不符要求时

    本文探讨了在编程实践中,即使程序输出了正确的结果,但若其实现方式未能严格遵循既定指令,仍可能被视为“不正确”的问题。我们将通过具体示例,对比直接求和与累加求和两种实现策略,强调理解和遵守编程规范的重要性,以确保代码的健壮性、可维护性及符合项目要求。 在软件开发过程中,我们经常会遇到这样的情况:编写的…

    2026年5月10日
    000
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • 网站标题关键词更新后,搜索引擎为何仍显示旧标题?

    网站标题更新后,搜索引擎为何显示旧标题? 网站SEO优化中,站长常修改网站标题关键词,期望搜索结果显示自定义标题。然而,即使更新标签、meta keywords、meta description和结构化数据中的name属性后,搜索结果仍显示旧标题,这令人费解。本文将对此进行解释。 问题:站长修改了网…

    2026年5月10日
    300
  • 深入理解 Express.js 中 next() 参数的作用与中间件机制

    本文深入探讨 express.js 中间件函数中的 `next()` 参数。它负责将控制权传递给请求-响应周期中的下一个中间件或路由处理程序。文章将详细解释 `next()` 的工作原理、中间件的注册与执行顺序,以及不正确使用 `next()` 可能导致请求挂起的风险,并通过代码示例和实际应用场景,…

    2026年5月10日
    000
  • Python命令怎样使用profile分析脚本性能 Python命令性能分析的基础教程

    使用Python的cProfile模块分析脚本性能最直接的方式是通过命令行执行python -m cProfile your_script.py,它会输出每个函数的调用次数、总耗时、累积耗时等关键指标,帮助定位性能瓶颈;为进一步分析,可将结果保存为文件python -m cProfile -o ou…

    2026年5月10日
    000
  • 如何插入查询结果数据_SQL插入Select查询结果方法

    如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法

    使用INSERT INTO…SELECT语句可高效插入数据,通过NOT EXISTS、LEFT JOIN、MERGE语句或唯一约束避免重复;表结构不一致时可通过别名、类型转换、默认值或计算字段处理;结合存储过程可提升可维护性,支持参数化与动态SQL。 将查询结果数据插入到另一个表中,可以…

    2026年5月10日 用户投稿
    400
  • Discord.py 交互按钮超时与持久化解决方案

    本教程旨在解决Discord.py中交互按钮在一段时间后出现“This Interaction Failed”错误的问题。我们将深入探讨视图(View)的超时机制,并提供通过正确设置timeout参数以及利用bot.add_view()方法实现按钮持久化的具体方案,确保您的机器人交互功能稳定可靠,即…

    2026年5月10日
    000
  • Python递归函数追踪与性能考量:以序列打印为例

    本文深入探讨了Python中一种递归打印序列元素的方法,并着重演示了如何通过引入缩进参数来有效追踪递归函数的执行流程和参数变化。通过实际代码示例,文章揭示了递归调用可能带来的潜在性能开销,特别是对调用栈空间的需求,以及Python默认递归深度限制可能导致的错误,为读者提供了理解和优化递归算法的实用见…

    2026年5月10日
    000
  • python中zip函数详解 python多序列压缩zip函数应用场景

    zip函数的应用场景包括:1) 同时遍历多个序列,2) 合并多个列表的数据,3) 数据分析和科学计算中的元素运算,4) 处理csv文件,5) 性能优化。zip函数是一个强大的工具,能够简化代码并提高处理多个序列时的效率。 在Python中,zip函数是一个非常有用的工具,它能够将多个可迭代对象打包成…

    2026年5月10日
    300
  • JavaScript 闭包:理解闭包原理与内存泄漏问题

    闭包是函数访问其外部作用域变量的能力,即使外部函数已执行完毕。如 inner 函数引用 outer 中的 count,形成闭包,使变量持久存在。闭包本身无害,但可能因延长变量生命周期导致内存泄漏,例如事件监听器引用大对象时。若未及时清理 DOM 事件或定时器,闭包会阻止垃圾回收,造成内存占用过高。解…

    2026年5月10日
    100
  • c++如何实现UDP通信_c++基于UDP的网络通信示例

    UDP通信基于套接字实现,适用于实时性要求高的场景。1. 流程包括创建套接字、绑定地址(接收方)、发送(sendto)与接收(recvfrom)数据、关闭套接字;2. 服务端监听指定端口,接收客户端消息并回传;3. 客户端发送消息至服务端并接收响应;4. 跨平台需处理Winsock初始化与库链接,编…

    2026年5月10日
    100

发表回复

登录后才能评论
关注微信