python 读写文件之 open 和 with open() 详细解析
python 读写文件之 open 和 with open() 详细解析
文章目录
- python 读写文件之 open 和 with open() 详细解析
- 1. open() 和 with open() 能打开不同的文件类型吗?
- 2. 文本文件和二进制文件的区别
- 2.1 文本文件 (Text Files)
- 2.2 二进制文件 (Binary Files)
- 区别
- 3. 读文件
- 3.1 使用 open() 和 close()
- 3.2 使用with open()
- 4. 写文件
- 4.1 字符编码
- 4.3 文件对象的属性
- 5.需要注意的点
当我们讨论文件操作时,通常会涉及到open()和close()这两个函数。在Python中,open()函数用于打开一个文件,并返回一个文件对象,而close()函数用于关闭之前打开的文件。然而,在实际编程中,使用with open()语句是一种更安全、更简洁的方式来处理文件操作。下面将详细介绍这些概念。
1. open() 和 with open() 能打开不同的文件类型吗?
open() 和 with open() 在 Python 中都能用来打开各种类型的文件,包括文本文件和二进制文件。它们之间的主要区别在于文件处理的方式和资源管理上,而不是它们能够打开的文件类型。
不论使用 open() 还是 with open(),你都可以打开以下类型的文件:
- 文本文件:
使用 ‘r’(读取模式)、‘w’(写入模式)、‘a’(附加模式)等文本模式来打开文件。 - 二进制文件:
使用 ‘rb’(读取二进制模式)、‘wb’(写入二进制模式)、‘ab’(附加二进制模式)等二进制模式来打开文件。
2. 文本文件和二进制文件的区别
2.1 文本文件 (Text Files)
文本文件是由一系列可打印的字符(如字母、数字、标点符号等)组成,这些字符按照某种编码标准(如 ASCII、UTF-8 等)表示。文本文件的主要特点包括:
- 可读性:它们可以直接由人阅读和理解。
- 通用性:大多数文本编辑器和处理器都能够打开和编辑文本文件。
- 简单性:文本文件通常不包含复杂的格式化信息,如字体样式、颜色等。
- 编码:文本文件需要使用一种字符编码方案来表示字符。常见的编码方案包括 ASCII、UTF-8、UTF-16 等。
文本文件的例子包括纯文本文件(.txt)、源代码文件(如 .py、.java)、HTML 文件(.html)、Markdown 文件(.md)等。
2.2 二进制文件 (Binary Files)
非文本文件或二进制文件包含了不仅仅是可打印字符的信息,还包括了无法直接显示或解释的字节序列。这类文件的特点包括:
- 不可读性:通常情况下,它们不能直接被人类阅读或理解,除非使用特定的工具或应用程序。
- 复杂性:非文本文件可能包含复杂的格式化信息、图形数据、音频数据等。
- 专用性:每种类型的非文本文件通常都需要相应的软件来打开和处理。
- 格式:非文本文件通常具有特定的文件格式,如图像文件(.jpg、.png)、音频文件(.mp3、.wav)、视频文件(.mp4、.avi)以及文档文件(.docx、.pdf)等。
区别
- 处理方式:文本文件通常使用字符编码来表示内容,而二进制文件则是以字节序列的形式存储数据。
- 编辑工具:文本文件可以用文本编辑器打开,而二进制文件需要特定的应用程序来解析和展示其内容。
- 存储效率:对于大量数据,二进制文件通常比文本文件更节省空间,因为文本文件需要额外的字符编码开销。
- 兼容性:文本文件更容易在不同的系统和平台上进行交换,而二进制文件可能由于平台差异导致兼容性问题。
3. 读文件
3.1 使用 open() 和 close()
使用Python内置的open()函数,传入文件名和标示符:
>>> f=open(r'F:\jupyter notebook files\text files.txt','r') #标示符'r'表示读
如果文件不存在,open()函数就会抛出一个错误,并且给出错误码和详细的信息告诉你文件不存在:
>>> f=open(r'F:\jupyter notebook files\text.txt','r')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'F:\\jupyter notebook files\\text.txt'
调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示:
>>> contents=f.read()
>>> print(contents)
naruto
bleach
onepiece
最后需要调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:
>>> f.close()
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现:
try:f=open(r'F:\jupyter notebook files\text files.txt','r')contents=f.read()print(contents)
finally:if f:f.close()
输出如下:
naruto
bleach
onepiece
3.2 使用with open()
每次都写close()比较繁琐,Python引入with语句,这样能够确保最后文件一定被关闭,且不用手动再调用close方法,效果和前面的try … finally是一样的。
注意:
1、调用read()会一次性读取文件的全部内容
with open(r'F:\jupyter notebook files\text files.txt','r') as f:contents=f.read()print(contents)
输出如下:
naruto
bleach
onepiece
2、调用readline()可以每次读取一行内容
with open(r'F:\jupyter notebook files\text files.txt','r') as f:a=f.readline()print(a)b=f.readline()print(b)c=f.readline()print(c)
输出如下:
narutobleachonepiece
3、调用readlines()一次读取所有内容并按行返回list
with open(r'F:\jupyter notebook files\text files.txt','r') as f:a=f.readlines()print(a)
输出入下:
['naruto\n', 'bleach\n', 'onepiece']
4. 写文件
调用open()函数时,传入标识符’w’或者’wb’表示写文本文件或写二进制文件:
with open(r'F:\jupyter notebook files\text files.txt','w') as f:a=f.write('attack on titan\n')
要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码。
4.1 字符编码
要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:
with open(r'F:\jupyter notebook files\gbk.txt', 'r', encoding='gbk') as f:a=f.read()print(a)
输出如下:
gbk文本
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
with open(r'F:\jupyter notebook files\gbk.txt', 'r', encoding='gbk',errors='ignore') as f: #注意errors='ignore'a=f.read()print(a)
4.2 读写方式列表
| 模式 | 描述 |
|---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
4.3 文件对象的属性
| 属性 | 描述 |
|---|---|
file.read([size]) | 将文件数据作为字符串返回,可选参数 size 控制读取的字节数 |
file.readlines([size]) | 返回文件中行内容的列表,size 参数可选 |
file.write(str) | 将字符串写入文件 |
file.writelines(strings) | 将字符串序列写入文件 |
file.close() | 关闭文件 |
file.closed | 表示文件已经被关闭,否则为 False |
file.mode | Access 文件打开时使用的访问模式 |
file.encoding | 文件所使用的编码 |
file.name | 文件名 |
file.newlines | 未读取到行分隔符时为 None,只有一种行分隔符时为一个字符串,当文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束的列表 |
file.softspace | 为 0 表示在输出一数据后,要加上一个空格符,1 表示不加。这个属性一般程序员用不着,由程序内部使用 |
5.需要注意的点
- 要读取非 UTF-8 编码的文本文件,需要给
open()函数传入encoding参数。 - 读取时调用
read()将一次性读取文件的全部内容,如果文件有 10GB,内存就爆了,保险起见可以反复调用read(size)方法,每次最多读取size个字节的内容。 - 调用
readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回 list。 - 根据需要调用:如果文件很小,
read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()更方便。
相关文章:
python 读写文件之 open 和 with open() 详细解析
python 读写文件之 open 和 with open() 详细解析 文章目录 python 读写文件之 open 和 with open() 详细解析1. open() 和 with open() 能打开不同的文件类型吗?2. 文本文件和二进制文件的区别2.1 文本文件 (Text Files)2.2 二进制文件 (Binary Files)区别 3. 读文…...
操作系统:内存----知识点
什么是虚拟内存? 虚拟内存简称虚存,是计算机系统内存管理的一种技术。它是相对于物理内存而言的,可以理解为“假的”内存。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),允许程序员编…...
pfx如何配置到nginx中
有pfx文件的时候如何在nginx上使用 好的,如果您已经确认没有中间证书(或中间证书内容为空),那么可以直接使用服务器证书和私钥。以下是简化后的步骤: 从PFX文件中导出私钥: openssl pkcs12 -in xxx.com.pfx…...
详细测评下搬瓦工香港CN2 GIA VPS
搬瓦工香港VPS分移动CMI和电信CN2 GIA两个大类,一个属于骨干网,一个属于轻负载。搬瓦工的香港CN2 GIA根据测试来看实际上是CN2 GIABGP,并非三网纯CN2 GIA。详细测评数据如下: 用FIO再给测试一下硬盘I/O,可以仔细看看数…...
Java中的五种线程池类型
Java中的五种线程池类型 1. CachedThreadPool (有缓冲的线程池)2. FixedThreadPool (固定大小的线程池)3. ScheduledThreadPool(计划线程池)4. SingleThreadExecutor (单线程线程池)…...
FFmpeg Windows安装教程
一. 下载ffmpeg 进入Download FFmpeg网址,点击下载windows版ffmpeg。 下载第一个essentials版本就行。 二. 环境配置 上面源码解压后如下 将bin添加到系统环境变量 验证安装是否成功,输入ffmpeg –version,显示版本即为安装成功。...
‘#‘ is not followed by a macro parameter 关于宏定义的错误
今天在项目代码上想定义一个这样的宏,结果编译错误,这个宏定义类似这样的: #define DELETE_FILE_DPP(key) \ #ifdef PLATFORM_DPP \delete_file(&key); \ #endif 因为有平台之分需要用到编译宏,但不想每个调用的地方都写 #i…...
内网穿透--meterpreter端口转发实验
实验背景 通过公司带有防火墙功能的路由器接入互联网,然后由于私网IP的缘故,公网无法直接访问内部主机,则需要通过已连接会话,代理穿透访问内网主机服务。 实验设备 1.路由器一台 2.内网 Win 7一台 3.公网 Kali 一台 4.网络 …...
Python 数据类:减少样板并提高可读性
一.介绍 在本文中,我们将了解数据类。Python 3.7 引入了数据类,这是一个强大的功能,它简化了创建主要用于存储数据的类的过程。数据类减少了样板代码并提供有用的默认行为,使您的代码更简洁、更高效。 二.为什么要使用数据类&am…...
家庭教育系列—北京海淀区”鸡娃“攻略
文章目录 1. 背景介绍2. 道3. 法3.1 **目标设定(Goal Setting)**3.2 **学习计划(Study Planning)**3.3 **资源利用(Resource Utilization)**3.4 **能力培养(Skill Development)**4. 术4.1 英语4.1.1 启蒙4.1.2 启蒙之后4.3 数学4.3.1 奥数4.3.2 普通数学知识4.4 语文4.…...
DLMS/COSEM中的信息安全:DLMS/COSEM安全概念(下)
3.安全语境 安全语境定义了与加密转换有关的安全属性,并包括以下元素: ——安全组件,确定可用的安全算法。 ——安全策略,在AA内对所有xDLMS APDU确定将应用的那种保护; ——与给定的安全算法相关的安全资料,包含安全密钥、初始化向量、公共密钥证书等。由于安全资料是针…...
基于 systemc-2.3.1的virtual device 接入 qemu-arm
1,下载systemc-2.3.1 下载网址: SystemC Files $ wget https://www.accellera.org/images/downloads/standards/systemc/systemc-2.3.1.tgz 2,编译安装 systemc-2.3.1 tar zxf systemc-2.3.1.tgz cd systemc-2.3.1/ export CXXg mkdir bu…...
(七)自动化测试
1. 简述什么是UI自动化测试? 正确回答通过率:78.0%[ 详情 ] 推荐指数: ★★★★ 试题难度: 中级 UI自动化测试(User Interface Automation Testing)是一种通过编写脚本或使用自动化测试工具,对用户界面(UI)进行自动化测试的方法。它可以模拟用户与应用程序或网站的交…...
【信创】virtualbox内虚拟机连接U盘 _ 统信 _ 麒麟 _ 中科方德
原文链接:【信创】virtualbox内虚拟机连接U盘 | 统信 | 麒麟 | 中科方德 Hello,大家好啊!今天给大家带来一篇关于在信创操作系统上使用VirtualBox虚拟机连接物理主机U盘的文章。在使用VirtualBox虚拟机时,有时候需要将物理主机上的…...
【2024】Datawhale AI夏令营 Task4笔记——vllm加速方式修改及llm推理参数调整上分
【2024】Datawhale AI夏令营 Task4笔记——vllm加速方式修改及llm推理参数调整上分 本文承接文章【2024】Datawhale AI夏令营 Task3笔记——Baseline2部分代码解读及初步上分思路,对其中vllm加速方式进行修改,推理速度获得了极大提升。另外,…...
腾讯OCR签名算法
云服务器 签名方法 v3-调用方式-API 中心-腾讯云 一,签名算法-官网 copy官网 package com.smcv.customer.service.util;import org.springframework.http.HttpHeaders;import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.D…...
CTFHUB-SSRF-DNS重绑定 Bypass
开启题目,页面空白,访问附件 附件是一个知乎的文章,翻到下面点击文中这个链接 跳转之后,进行设置 把得到的链接拼接到题目的后面进行访问,然后得到了本题的 flag...
【oracle】数据库基本使用
一、oracle数据库简介 Oracle 数据库,亦称 Oracle RDBMS,或简称 Oracle,是一款由甲骨文公司推出的高效、稳定且广泛应用的关系型数据库管理系统。该数据库系统不仅在数据管理领域处于领先地位,而且由于其良好的可移植性、易用性和…...
Action部署在线上写文章
原文:https://blog.c12th.cn/archives/32.html 前言 之前分别出了 Hexo 和 Hugo 的 Action搭建教程,相当于伪动态,可以在线上写文章了;不过对于喜欢魔改的同学就不太友好了qwq 教程 github.dev 确保在配置过程中能访问Github &…...
CC链 (Commons Collections)
目录 前置知识 CC链: https://mvnrepository.com/ CC链 CC链 Commons Collections --apache组织发布的开源库 里面主要对集合的增强以及扩展类 被广泛使用 组件,HashMap HashTable ArrayList总结CC链: 就是有反序列化入口,同时有cc库的情况下,…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
代理服务器-LVS的3种模式与调度算法
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们上一章介绍了Web服务器,其中以Nginx为主,本章我们来讲解几个代理软件:…...
学习 Hooks【Plan - June - Week 2】
一、React API React 提供了丰富的核心 API,用于创建组件、管理状态、处理副作用、优化性能等。本文档总结 React 常用的 API 方法和组件。 1. React 核心 API React.createElement(type, props, …children) 用于创建 React 元素,JSX 会被编译成该函数…...
day51 python CBAM注意力
目录 一、CBAM 模块简介 二、CBAM 模块的实现 (一)通道注意力模块 (二)空间注意力模块 (三)CBAM 模块的组合 三、CBAM 模块的特性 四、CBAM 模块在 CNN 中的应用 一、CBAM 模块简介 在之前的探索中…...
