Python 中 open(),close()组合与 with open()的区别

本文详细介绍了Python中open()函数的基本用法,包括读取文件、打开模式和编码方式的选择。同时,对比了open()与with open()在文件操作中的区别,强调了with open()在自动关闭文件方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、open()函数的基本用法

在介绍区别之前先简单说明 open() 函数的用法,分为以下三个部分:

1. 读取文件

使用格式:

文件句柄 = open('文件路径', '模式',编码方式)

流程如下:

f = open(file_path, 'r', encoding='utf-8')  # 打开文件, 编码方式可省略,一般取默认
data = f.read()                             # 读取文件
print(data)                                 # 打印读取内容
f.close()                                   # 关闭文件

或 
with open(file_name, 'r') as f:
	data = f.read()                         # 读取文件
	print(data)                             # 打印读取内容                                  

注意,上述文件的 file_path 也就是文件的路径,可以是绝对路径(文件在硬盘的位置路径),也可以是相对路径(与脚本同在一个目录下)。
上述读取文件是使用 read () 表示读取整个文件的内容,也可以使用 readline() 表示读取文件一行,或 readlines() 按行读取文件内容。最后要使用 close() 函数关闭文件。

2. 打开模式

模式的参数也就是第二个参数,主要有以下模式:


r   以只读方式打开文件。这是默认模式,文件必须存在,不存在抛出错误
rb  以二进制格式打开一个文件用于只读。
r+  打开一个文件用于读写。文件指针将会放在文件的开头,读完就追加。
w   打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+  打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a   打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+  打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

注:后面有带 b 的方式,不需要考虑编码方式。带 + 号的,则可读可写,不过它们之间还是有区别的。

3. 编码方式

  • win系统默认是gbk编码的,所以桌面生成的TXT之类的都是gbk编码的;
  • 出现乱码,一般都是原文件的编码方式和打开指定的编码不一致所致。

二、open(),close()与 with open()的区别

这也是我们平时读取文件容易忽略的地方。

  • 一般是使用 open()close() 组合来打开和关闭文件。
    但这样做时,如果程序存在bug,导致close()语句未执行,文件将不会关闭。这看似微不足道,但未妥善地关闭文件可能会导致数据丢失或受损。如果在程序中过早地调用close(),你会发现需要使用文件时它已关闭(无法访问),这会导致更多的错误。
  • 关键字 with 在不再需要访问文件后自动将其关闭。
    在这个程序中,注意到我们调用了open(),但没有调用close();并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过使用关键字 with,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。
### Python 使用 `with open` 关闭文件的最佳实践 在 Python 中,使用 `with open()` 是一种推荐的方式来处理文件操作。这种方式不仅能够简化代码结构,还能自动管理资源释放过程,从而避免因忘记调用 `close()` 方法而导致的潜在问题。 #### 自动化资源管理 当使用 `with open()` 语句时,无论是在正常执行路径下还是发生异常的情况下,Python 都会确保文件对象被正确关闭[^1]。这意味着开发者无需显式调用 `file.close()`,减少了手动干预带来的错误风险。 以下是利用 `with open()` 打开并读取文件的一个典型例子: ```python with open('example.txt', 'r') as file: content = file.read() print(content) ``` 在这个示例中,一旦离开 `with` 块的作用域,即使发生了未捕获的异常,文件也会立即被关闭[^2]。 #### 支持多种模式的操作 除了基本的只读 (`'r'`) 模式外,还可以通过指定不同的参数实现其他类型的文件访问需求,比如写入 (`'w'`) 或追加 (`'a'`) 数据到现有文件中去。下面展示了一个向新创建或者已存在的文本文件末尾添加一行字符串的例子: ```python data_to_append = "\nThis is a new line added at the end." with open('output_file.txt', 'a') as f: f.write(data_to_append) ``` 这里需要注意的是,在完成上述动作之后不需要再单独调用任何额外命令来保证资源回收;因为这一切都已经由上下文管理器内部机制妥善安排好了。 #### 结合 CSV 文件处理 如果目标是从 .csv 类型的数据集中提取信息,则可以进一步结合 csv 库中的 reader/writer 功能增强效率灵活性。例如要逐行解析一个标准格式化的逗号分隔值文档内容可按如下方式进行设置: ```python import csv filename = 'sample.csv' with open(filename, newline='') as csvfile: spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') for row in spamreader: print(', '.join(row)) ``` 此脚本片段展示了如何加载名为 sample.csv 的本地存储表格资料,并将其每行列印出来作为输出显示给用户查看[^3]。 综上所述,采用 `with open()` 不仅让源码更加清晰易懂而且有效提升了程序运行期间的安全性和稳定性水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值