当前位置: 首页 > news >正文

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(),你都可以打开以下类型的文件:

  1. 文本文件:
    使用 ‘r’(读取模式)、‘w’(写入模式)、‘a’(附加模式)等文本模式来打开文件。
  2. 二进制文件:
    使用 ‘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.modeAccess 文件打开时使用的访问模式
file.encoding文件所使用的编码
file.name文件名
file.newlines未读取到行分隔符时为 None,只有一种行分隔符时为一个字符串,当文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束的列表
file.softspace0 表示在输出一数据后,要加上一个空格符,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() 能打开不同的文件类型吗&#xff1f;2. 文本文件和二进制文件的区别2.1 文本文件 (Text Files)2.2 二进制文件 (Binary Files)区别 3. 读文…...

操作系统:内存----知识点

什么是虚拟内存&#xff1f; 虚拟内存简称虚存&#xff0c;是计算机系统内存管理的一种技术。它是相对于物理内存而言的&#xff0c;可以理解为“假的”内存。它使得应用程序认为它拥有连续可用的内存&#xff08;一个连续完整的地址空间&#xff09;&#xff0c;允许程序员编…...

pfx如何配置到nginx中

有pfx文件的时候如何在nginx上使用 好的&#xff0c;如果您已经确认没有中间证书&#xff08;或中间证书内容为空&#xff09;&#xff0c;那么可以直接使用服务器证书和私钥。以下是简化后的步骤&#xff1a; 从PFX文件中导出私钥&#xff1a; openssl pkcs12 -in xxx.com.pfx…...

详细测评下搬瓦工香港CN2 GIA VPS

搬瓦工香港VPS分移动CMI和电信CN2 GIA两个大类&#xff0c;一个属于骨干网&#xff0c;一个属于轻负载。搬瓦工的香港CN2 GIA根据测试来看实际上是CN2 GIABGP&#xff0c;并非三网纯CN2 GIA。详细测评数据如下&#xff1a; 用FIO再给测试一下硬盘I/O&#xff0c;可以仔细看看数…...

Java中的五种线程池类型

Java中的五种线程池类型 1. CachedThreadPool &#xff08;有缓冲的线程池&#xff09;2. FixedThreadPool &#xff08;固定大小的线程池&#xff09;3. ScheduledThreadPool&#xff08;计划线程池&#xff09;4. SingleThreadExecutor &#xff08;单线程线程池&#xff09…...

FFmpeg Windows安装教程

一. 下载ffmpeg 进入Download FFmpeg网址&#xff0c;点击下载windows版ffmpeg。 下载第一个essentials版本就行。 二. 环境配置 上面源码解压后如下 将bin添加到系统环境变量 验证安装是否成功&#xff0c;输入ffmpeg –version&#xff0c;显示版本即为安装成功。...

‘#‘ is not followed by a macro parameter 关于宏定义的错误

今天在项目代码上想定义一个这样的宏&#xff0c;结果编译错误&#xff0c;这个宏定义类似这样的&#xff1a; #define DELETE_FILE_DPP(key) \ #ifdef PLATFORM_DPP \delete_file(&key); \ #endif 因为有平台之分需要用到编译宏&#xff0c;但不想每个调用的地方都写 #i…...

内网穿透--meterpreter端口转发实验

实验背景 通过公司带有防火墙功能的路由器接入互联网&#xff0c;然后由于私网IP的缘故&#xff0c;公网无法直接访问内部主机&#xff0c;则需要通过已连接会话&#xff0c;代理穿透访问内网主机服务。 实验设备 1.路由器一台 2.内网 Win 7一台 3.公网 Kali 一台 4.网络 …...

Python 数据类:减少样板并提高可读性

一.介绍 在本文中&#xff0c;我们将了解数据类。Python 3.7 引入了数据类&#xff0c;这是一个强大的功能&#xff0c;它简化了创建主要用于存储数据的类的过程。数据类减少了样板代码并提供有用的默认行为&#xff0c;使您的代码更简洁、更高效。 二.为什么要使用数据类&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&#xff0c;下载systemc-2.3.1 下载网址&#xff1a; SystemC Files $ wget https://www.accellera.org/images/downloads/standards/systemc/systemc-2.3.1.tgz 2&#xff0c;编译安装 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盘 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;【信创】virtualbox内虚拟机连接U盘 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在信创操作系统上使用VirtualBox虚拟机连接物理主机U盘的文章。在使用VirtualBox虚拟机时&#xff0c;有时候需要将物理主机上的…...

【2024】Datawhale AI夏令营 Task4笔记——vllm加速方式修改及llm推理参数调整上分

【2024】Datawhale AI夏令营 Task4笔记——vllm加速方式修改及llm推理参数调整上分 本文承接文章【2024】Datawhale AI夏令营 Task3笔记——Baseline2部分代码解读及初步上分思路&#xff0c;对其中vllm加速方式进行修改&#xff0c;推理速度获得了极大提升。另外&#xff0c;…...

腾讯OCR签名算法

云服务器 签名方法 v3-调用方式-API 中心-腾讯云 一&#xff0c;签名算法-官网 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

开启题目&#xff0c;页面空白&#xff0c;访问附件 附件是一个知乎的文章&#xff0c;翻到下面点击文中这个链接 跳转之后&#xff0c;进行设置 把得到的链接拼接到题目的后面进行访问&#xff0c;然后得到了本题的 flag...

【oracle】数据库基本使用

一、oracle数据库简介 Oracle 数据库&#xff0c;亦称 Oracle RDBMS&#xff0c;或简称 Oracle&#xff0c;是一款由甲骨文公司推出的高效、稳定且广泛应用的关系型数据库管理系统。该数据库系统不仅在数据管理领域处于领先地位&#xff0c;而且由于其良好的可移植性、易用性和…...

Action部署在线上写文章

原文&#xff1a;https://blog.c12th.cn/archives/32.html 前言 之前分别出了 Hexo 和 Hugo 的 Action搭建教程&#xff0c;相当于伪动态&#xff0c;可以在线上写文章了&#xff1b;不过对于喜欢魔改的同学就不太友好了qwq 教程 github.dev 确保在配置过程中能访问Github &…...

CC链 (Commons Collections)

目录 前置知识 CC链: https://mvnrepository.com/ CC链 CC链 Commons Collections --apache组织发布的开源库 里面主要对集合的增强以及扩展类 被广泛使用 组件,HashMap HashTable ArrayList总结CC链: 就是有反序列化入口&#xff0c;同时有cc库的情况下&#xff0c…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...