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中支持…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
