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库的情况下,…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...

快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...