Python基础之文件操作(I/O)
和其他编程语言一样,Python 也具有操作文件(I/O)的能力,比如打开文件、读取和追加数据、插入和删除数据、关闭文件、删除文件等。合理应用python提供的文件操作基本函数,可大大提高自动化实现的效率与框架代码的稳定性。
一、文件路径
绝对路径:总是从根文件夹开始,Window 系统中以盘符(C:、D:)作为根文件夹,而 OS X 或者 Linux 系统中以 / 作为根文件夹。
相对路径:指的是文件相对于当前工作目录所在的位置。例如,当前工作目录为 "C:\Windows\System32",若文件 demo.txt 就位于这个 System32 文件夹下,则 demo.txt 的相对路径表示为 ".\demo.txt"(其中 .\ 就表示当前所在目录),如果要表示上级目录,我们可用..\表示,在上述例子可定位到Windows文件夹
Python os.path 模块提供了一些函数,可以实现绝对路径和相对路径之间的转换
- 调用 os.path.abspath(path) 将返回 path 参数的绝对路径的字符串,这是将相对路径转换为绝对路径的简便方法。
import osfile_path = r'./t0704_4.py'file_path_abs = os.path.abspath(file_path)
print(file_path_abs)结果:
/Users/jie/PythonProjects/jctesting_study/D0704_3/t0704_4.py
- 调用 os.path.isabs(path),如果参数是一个绝对路径,就返回 True,如果参数是一个相对路径,就返回 False。
- 调用 os.path.split(path) 将返回一个元祖,它包含path参数的目录名称和基本名称。
import osfile_path = r'/Users/jie/PythonProjects/jctesting_study/D0704_3/t0704_4.py'path_split = os.path.split(file_path)
print(path_split)结果:
('/Users/fujinjie/PythonProjects/jctesting_study/D0704_3', 't0704_4.py')
调用 os.path.dirname(path) 将返回一个字符串,它包含 path 参数中最后一个斜杠之前的所有内容;调用 os.path.basename(path) 将返回一个字符串,它包含 path 参数中最后一个斜杠之后的所有内容。
import osfile_path = r'/Users/jie/PythonProjects/jctesting_study/D0704_3/t0704_4.py'path_dir = os.path.dirname(file_path)
print(path_dir)path_base = os.path.basename(file_path)
print(path_base)结果:
/Users/jie/PythonProjects/jctesting_study/D0704_3
t0704_4.py
调用os.path.exists(path)判断这个path是否存在,返回一个布尔值,True代表存在,False代表不存在
# 判断log_path是否存在,如果不存在就创建这个log_path
if not os.path.exists(log_path):os.makedirs(log_path)
二、文件操作
写入、读取:是文件最常用的操作,作用于文件的内容,属于应用级操作;对于文件的应用级操作,通常需要按照固定的步骤进行操作
- 打开文件:使用 open() 函数,该函数会返回一个文件对象;
- 对已打开文件做读/写操作:读取文件内容可使用 read()、readline() 以及 readlines() 函数;向文件中写入内容,可以使用 write() 函数。
- 关闭文件:完成对文件的读/写操作之后,最后需要关闭文件,可以使用 close() 函数。
(一)、打开文件
Python中通过内置的 open( )函数来打开文件,open()函数常用调用方法如下
file = open(file_name, mode, encoding)
- file:表示要创建的文件对象。
- file_name:要创建或打开文件的文件名称,该名称要用引号(单引号或双引号都可以)括起来。需要注意的是,如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可;否则,此参数需要指定打开文件所在的完整路径。
- mode:可选参数,用于指定文件的打开模式。可选的打开模式如表 1 所示。如果不写,则默认以只读(r)模式打开文件。
- encoding:手动设定打开文件时所使用的编码格式,不同平台的 ecoding 参数值也不同,以 Windows 为例,其默认为 cp936(实际上就是 GBK 编码)。
file = open('/Users/jie/Downloads/测试文件1.txt','r',encoding='utf-8')
open( ) 中传入要打开的"文件地址+文件名",以及标示符'r'(r,表示只读)
open函数支持的文件打开模式

文件打开模式,直接决定了后续可以对文件做哪些操作。例如,使用 r 模式打开的文件,后续编写的代码只能读取文件,而无法修改文件内容。
成功打开文件之后,可以调用文件对象本身拥有的属性获取当前文件的部分信息,其常见的属性为:
- file.name:返回文件的名称;
- file.mode:返回打开文件时,采用的文件打开模式;
- file.encoding:返回打开文件时使用的编码格式;
- file.closed:判断文件是否己经关闭。
(二)、读取文件read()、readline()、readlines()函数
通过 read( ) 函数对打开的文件进行内容全部的读取,文件内容以str对象放入内存中
file.read()
print(file.read()) # 欢迎来到精创学习!
print(type(file.read())) # <class 'str'>
读取完文件后,我们需要通过 close( ) 函数把文件进行关闭,文件使用完后需要被关闭,因为文件对象会占用系统资源,并且系统同一时间能打开的文件数量是有限制的
file.close() # 调用close()函数来关闭打开的文件来释放被占用的系统资源
注意:想使用 read() 函数成功读取文件内容,除了严格遵守 read() 的语法外,其还要求 open() 函数必须以可读默认(包括 r、r+、rb、rb+)打开文件。举个例子,将上面程序中 open()的打开模式改为 w,程序会抛出io.UnsupportedOperation异常,提示文件没有读取权限
通过上述代码,我们来结合try...except...finally来完成文件的打开-读取-关闭
def read_file(file_name='/Users/jie/Downloads/测试文件1.txt'):f = Nonetry:f = open(file_name,'r',encoding='utf-8')r = f.read()print(r)except:print("文件读取异常!")finally:if f:f.close()print('关闭打开的文件')s = read_file()
这里定义了一个了函数 read_file(file_name) 来实现文件读取功能,函数中,给变量f默认值为None, 目的在于程序一执行就会自动创建变量f,供下面try: 和 finally: 语句调用;
问题:上述代码为什么要在一开始就定义变量: f 呢?
Python中 read( ) 函数会一次性读取文件的全部内容到内存中,试设想,如果这个文件非常庞大,那么内存就会溢出,因此在调用read( ) 函数读取文件时,要注意读取对象数据量,如果想按行读取可调用 readline( ),这样每次读取一行;调用 read(size) 方法,每次读取 size 个字节的内容,还有 readlines( ) 也是一次读取所有内容,但是按行读取,返回一个list,所以读取文件时要根据实际灵活运用上面三个函数。
readline( )
def read_file(file_name='C:\\Users\\37210\\Desktop\\测试文件1.txt'):f = Nonetry:f = open(file_name,'r',encoding='utf-8')while f:r = f.readline()if r:print(r)else:breakexcept Exception as e:print("文件读取异常!")print(e)finally:if f:f.close()print('关闭打开的文件')s = read_file()这是文本第1行。这是文本第2行。这是文本第3行。
关闭打开的文件
readline()方法每次读取一行;返回的是一个字符串对象,保持当前行的内存;即通过循环按行读取。
readlines( )
def read_file(file_name='C:\\Users\\37210\\Desktop\\测试文件1.txt'):f = Nonetry:f = open(file_name,'r',encoding='utf-8')r = f.readlines()print(r) # ['这是文本第1行。\n', '这是文本第2行。\n', '这是文本第3行。\n']for i in r: # 通过循环遍历这个listprint(i)except Exception as e:print("文件读取异常!")print(e)finally:if f:f.close()print('关闭打开的文件')s = read_file()['这是文本第1行。\n', '这是文本第2行。\n', '这是文本第3行。\n']
这是文本第1行。这是文本第2行。这是文本第3行。关闭打开的文件
readlines( ) 方法一次性读取全部内容到内存,每一行字符串作为一个元素,返回一个list,可通过for循环来遍历这个list,获取每行内容
上述返回结果
['这是文本第1行。\n', '这是文本第2行。\n', '这是文本第3行。\n']
列表中每个元素都包含一个'\n',即回车符,导致输出结果含有空行,这里可使用 replace( ) 函数来处理
for i in r:i = i.replace('\n','') # 通过replace把'\n'替换成'',达到去除'\n'的目的print(i)这是文本第1行。
这是文本第2行。
这是文本第3行。
关闭打开的文件
任务:分别通过read( ) 、readline( ) 、readlines( ) 对文本完成打开-读取-关闭
任务:通过replace( ) 函数,把读取到的字符串中'。'代替为'!'
(三)、关闭文件
close()函数是专门用来关闭已经打开的文件的,语法如下:
file.close()
期中,file表示已打开的文件对象,对于已经通过open()函数打开的文件,操作完成后一定要调用close()函数进行关闭,进行系统资源释放,否则程序容易出现问题。
(四)、通过 with open ...as...语句来打开一个文件
上面我们已经了解通过open()函数打开一个文件后需要通过close()来关闭这个打开的文件,目的是释放资源,防止资源泄露,在python中提供了with...as...语句来操作上下文管理器,以及时释放资源,使用 with as 操作已经打开的文件对象,无论期间是否抛出异常,都能保证 with as 语句执行完毕后自动关闭已经打开的文件。
基本表达式:
with 表达式 as 别名(变量):代码块
上述读取一个文件的操作是 :open-read-close,通过 with open 可简化步骤:with open-read
通过 with 关键字,当文件读取完毕,程序会自动关闭文件,无需调用 close( ) 函数
def read_file(file_name='C:\\Users\\37210\\Desktop\\测试文件1.txt'):try:with open(file_name,'r',encoding='utf-8') as f:r = f.readlines()print(r)for i in r:i = i.replace('\n','')print(i)except Exception as e:print("文件读取异常!")print(e)if f.closed: # 通过调用 f.closed 来判断打开的文件是否已关闭,已关闭返回True,否则返回Falseprint('文件已关闭')s = read_file()['这是文本第1行。\n', '这是文本第2行。\n', '这是文本第3行。\n']
这是文本第1行。
这是文本第2行。
这是文本第3行。
文件已关闭
任务:通过 whit open...as... 来改造上述代码的 read( ) 、readline( )
(五)、写入文件
写入文件时把open函数中 'r' 改成 'w',通过 f.write(要写入的内容) 来对文件进行写入操作,同样需要close( )函数来关闭打开的文件
基本语法格式:
file.write(string)
def read_file(file_name='C:\\Users\\37210\\Desktop\\测试文件1.txt'):f = Nonetry:f = open(file_name,'w',encoding='utf-8')w = f.write('写入第一句话。')except Exception as e:print("写入文件异常!")print(e)finally:if f:f.close()print('关闭打开的文件')s = read_file()
此时打开'C:\\Users\\37210\\Desktop\\测试文件1.txt'文件,会发现文件中存在的是“写入第一句话。”字符串
通过 with open ... as...来简化
def read_file(file_name='C:\\Users\\37210\\Desktop\\测试文件1.txt'):try:with open(file_name,'w',encoding='utf-8') as f:f.write('写入第二句话。')except BasException as e:print("写入文件异常!")print(e)s = read_file()
同样通过 with open ... as ..来写入文件,可以省略close( )方法,上述通过参数 'w' 来写入会直接覆盖原文件,把 'w' 改成 'a' 就可以实现追加的方式写入
def read_file(file_name='C:\\Users\\37210\\Desktop\\测试文件1.txt'):try:with open(file_name,'a',encoding='utf-8') as f: # 以追加的方式写入f.write('写入第二句话。')except Exception as e:print("写入文件异常!")print(e)s = read_file()写入第一句话。写入第二句话。
打开'C:\\Users\\37210\\Desktop\\测试文件1.txt'文件,文件中:“写入第一句话。写入第二句话。”
如果,在写入操作时,file_name不存在,则程序会自动创建这个名称的文件,并写入数据。
任务:在桌面创建一个新的空文本文件,分别通过 open...write...close 的方式写入一句话
任务:对上一任务通过 with open...as... 来改造简化
任务:结合上一任务,以追加的形式写入
相关文章:
Python基础之文件操作(I/O)
和其他编程语言一样,Python 也具有操作文件(I/O)的能力,比如打开文件、读取和追加数据、插入和删除数据、关闭文件、删除文件等。合理应用python提供的文件操作基本函数,可大大提高自动化实现的效率与框架代码的稳定性…...
k8s--helm
什么是helm?在没有这个helm之前,deployment service ingress helm的作用 通过打包的方式,把deployment service ingress等打包在一块,一键式的部署服务,类似yum安装 官方提供的一个类似与安装仓库额功能,…...
算法训练营第五十六天|583. 两个字符串的删除操作 72. 编辑距离
目录 Leetcode583. 两个字符串的删除操作Leetcode72. 编辑距离 Leetcode583. 两个字符串的删除操作 文章链接:代码随想录 题目链接:583. 两个字符串的删除操作 思路:直接记录需要改(增或删)几个,也就是求不…...
使用WAF防御网络上的隐蔽威胁之目录穿越
目录穿越(Directory Traversal)是一种网络安全攻击手段,也被称为路径穿越。 这种攻击允许攻击者访问存储在Web服务器文件系统上的文件和目录,这些文件和目录原本不应该对用户可见或可访问。 通过利用安全漏洞,攻击者…...
Linux:vim的相关知识
目录 vim 是一个较为常见的编译文件的命令操作。 三种模式的区分的作用如下: 命令模式: 插入模式: 进入插入模式的标志:左下角有INSERT 底行模式: 命令模式的常见命令: 底行模式常见命令࿱…...
Qt 国产嵌入式操作系统实现文字转语音功能(ekho库)
1.简介 Qt 国产嵌入式操作系统实现文字转语音功能(TTS)_tts驱动 转文字-CSDN博客 在继上篇文章之后,甲方粑粑不满意使用eSpeak发出的声音太难听了,这就不得不找个替代品,声音稍微好听了一些。 使用ekho开源库。 Ekho(余音)是一个免费、开源的中文语音合成软件。它目…...
Redis常见类型及常用命令
目录 常见的数据类型 一、String类型 1、简介 2、常用命令 (1)新建key (2)设值取值 编辑 (3)批量操作 (4)递增递减 3、原子性操作 4、数据结构 二、list类型 1、list常…...
实战纪实 | 某配送平台zabbix 未授权访问 + 弱口令
本文由掌控安全学院 - 17828147368 投稿 找到一个某src的子站,通过信息收集插件wappalyzer,发现ZABBIX-监控系统: 使用谷歌搜索历史漏洞:zabbix漏洞 通过目录扫描扫描到后台,谷歌搜索一下有没有默认弱口令 成功进去了…...
【第十五课】数据结构:堆 (“堆”的介绍+主要操作 / acwing-838堆排序 / c++代码 )
目录 关于堆的一些知识的回顾 数据结构:堆的特点 "down" 和 "up":维护堆的性质 down up 数据结构:堆的主要操作 acwing-838堆排序 代码如下 时间复杂度分析 确实是在写的过程中频繁回顾了很多关于树的知识&…...
前端JavaScript篇之JavaScript有哪些数据类型,它们的区别?
目录 JavaScript有哪些数据类型,它们的区别?数据类型区别 JavaScript有哪些数据类型,它们的区别? 数据类型 JavaScript数据类型有: Undefined、Null、Boolean、Number、String、Array、Object、Symbol、BigInt… St…...
LeetCode---380周赛
题目列表 3005. 最大频率元素计数 3006. 找出数组中的美丽下标 I 3007. 价值和小于等于 K 的最大数字 3008. 找出数组中的美丽下标 II 一、最大频率元素计数 这题就是个简单的计数题,正常遍历统计数据即可,关键是你要会写代码逻辑。 代码如下&…...
archlinux 如何解决安装以后没有声音的问题
今天安装完archlinux以后发现看视频没声音 检查一下是否有 /lib/firmware/intel/sof 发现没有 如果你也是这样的话,可以尝试安装: sudo pacman -S sof-firmware 重启后再看看有没有声音: reboot 反正我有声音了...
什么是ORM思想?
1. ORM概念 ORM(Object Relational Mapping)对象关系映射模式,是一种技术,解决了面向对象与关系型数据库存互不匹配的现象。 ORM在业务逻辑层和数据库层之间充当了桥梁的作用。 2. ORM由来 在软件开发的过程中,通常…...
设计接口时,为其添加签名鉴权---详细教程
一、何为签名 我们知道无论是restful api还是传统接口、亦或是其他形式接口的调用,接口签名都是非常重要的安全机制,它可以确保请求的发起者是经过认证和授权的客户端,同时也可以防止接口被攻击,请求参数被篡改等等。 用大白话来解…...
5G+物联网:连接万物,重塑智慧社区,开启未来生活新纪元,助力智慧社区的革新与发展
一、5G与物联网:技术概述与基础 随着科技的飞速发展,第五代移动通信技术(5G)和物联网(IoT)已经成为当今社会的热门话题。这两项技术作为现代信息社会的核心基础设施,正深刻地改变着人们的生活和…...
[反转链表] [合并两个有序链表][分割链表]
这里写目录标题 反转链表合并两个有序链表分割链表 反转链表 1、题目: 2.思路 思路1:建立一个newHead,取一个节点进行头插。具体做法如下! 建立一个newHead(新头),由于一个节点里面存的是下一个节点的地址,如果取…...
中文数据让LLM变笨?
我这里先贴一下论文的原链接: https://arxiv.org/abs/2401.10286 然后贴一下我翻译标注的下载链接:https://gitee.com/chatpaper/arXiv_top_chinese/blob/master/0801_top/%E4%B8%AD%E6%96%87%E4%BC%9A%E8%AE%A9LLM%E5%8F%98%E7%AC%A8%EF%BC%9F.pdf 先…...
【代码随想录】刷题笔记Day54
前言 差单调栈就结束代码随想录一刷啦,回家二刷打算改用python补充进博客,小涛加油!!! 647. 回文子串 - 力扣(LeetCode) 双指针法 中心点外扩,注意中心点可能有一个元素可能有两个…...
二.Winform使用Webview2在Demo1中实现地址简单校验
Winform使用Webview2在Demo1中实现地址简单校验 往期目录回顾添加对于的简单url验证提示通过上节和本节涉及到的函数有 往期目录 往期相关文章目录 专栏目录 回顾 通过一.Winform使用Webview2(Edge浏览器核心) 创建demo(Demo1)实现回车导航到指定地址 我们已经知道了解决资源…...
从0开始学习C++ 第二十课:模板与泛型编程
第二十课:模板与泛型编程 学习目标: 掌握模板的基本语法和概念。学会使用函数模板来创建可重用的函数。学习如何定义类模板以实现数据结构的泛型。理解模板在C中提供的灵活性和强大功能。 学习内容: 模板的概念: 模板是C中支持…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
