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)   

二、文件操作

写入、读取:是文件最常用的操作,作用于文件的内容,属于应用级操作;对于文件的应用级操作,通常需要按照固定的步骤进行操作

  1. 打开文件:使用 open() 函数,该函数会返回一个文件对象;
  2. 对已打开文件做读/写操作:读取文件内容可使用 read()、readline() 以及 readlines() 函数;向文件中写入内容,可以使用 write() 函数。
  3. 关闭文件:完成对文件的读/写操作之后,最后需要关闭文件,可以使用 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... 来改造简化

任务:结合上一任务,以追加的形式写入

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ | 六、栈 Stack、队列 Queue

栈的基础知识 栈&#xff08;stack&#xff09;是一种数据结构&#xff0c;在C中属于STL&#xff08;标准库&#xff09;特点&#xff1a;先进后出 栈的使用&#xff1a; 一、引入头文件<stack>二、创建栈变量&#xff08;类似容器、集合的创建方式&#xff09;&#xf…

【Linux】Linux编译器-gcc/g++使用

1. 背景知识 预处理&#xff08;进行宏替换) 编译&#xff08;生成汇编) 汇编&#xff08;生成机器可识别代码&#xff09; 连接&#xff08;生成可执行文件或库文件) 2. gcc如何完成 格式 gcc [选项] 要编译的文件 [选项] [目标文件] 预处理(进行宏替换) 预处理功能主要包括…

【Linux】-对于信号章节补充的知识点,以及多线程知识的汇总

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

【shell-09】 shell控制台颜色输出

echo -e echo -e 一个重要的小例子和换行符控制字符一样&#xff0c;终端颜色也有自己的十进制控制符颜色的写法颜色参考图表 echo -e 一个重要的小例子 echo -e 的意思&#xff1a;如果字符串中出现某些特定的字符组合&#xff08;转义字符&#xff09;&#xff0c;echo会将这…

大模型学习与实践笔记(十二)

使用RAG方式&#xff0c;构建opencv专业资料构建专业知识库&#xff0c;并搭建专业问答助手&#xff0c;并将模型部署到openxlab 平台 代码仓库&#xff1a;https://github.com/AllYoung/LLM4opencv 1&#xff1a;创建代码仓库 在 GitHub 中创建存放应用代码的仓库&#xff…

DAY08_SpringBoot—整合Mybatis-Plus

目录 1 MybatisPlus1.1 MP介绍1.2 MP的特点1.3 MybatisPlus入门案例1.3.1 导入jar包1.3.2 编辑POJO对象1.3.3 编辑Mapper接口1.3.4 编译YML配置文件1.3.5 编辑测试案例 1.4 MP核心原理1.4.1 需求1.4.2 原理说明1.4.3 对象转化Sql原理 1.5 MP常规操作1.5.1 添加日志打印1.5.2 测…

电脑存储位置不够怎么办

电脑内存不够怎么办&#xff01;&#xff01;&#xff01; 我前段时间经常因为电脑D盘内存不够而苦恼&#xff08;毕竟电脑内存就那么丁点&#xff0c;C盘作为系统盘不能随便下东西的情况下&#xff0c;就只能选择其他盘进 方法一&#xff1a;检查电脑硬盘的分区情况&#xf…

全国大学生智能汽车竞赛—解决Ubuntu 18.04.6 无法连接网络的问题

1.1 用到的命令 lshw &#xff08;1&#xff09;功能描述: lshw是一个提取机器硬件配置详细信息的工具&#xff0c;并且能将结果输出成HTML、json、XML等格式。 &#xff08;2&#xff09;输出形式&#xff1a; -class 仅显示一类硬件信息&#xff0c;可以使用lshw -short或ls…

如何通过系统命令排查账号安全?

如何通过系统命令排查账号安全 query user 查看当前登录账号 logoff id 注销用户id net user 查看用户 net user username 查看用户登录情况 lusrmgr.msc 查看隐藏账号 winR打开regedit注册表 找到计算机\HEKY_LOCAL_MACHINE\SAM\SAM\右键给与用户读写权限 刷新打开 HKEY…

ps去除图片上的文字

1. 打开ps, 打开文件 2. 选择套索工具 3. 使用套索工具将需要去除的文字框选 4. 然后鼠标右击&#xff0c;选择内容识别填充 5. 应用确定后, 此时文字就去掉了

保姆级CISP报考攻略,让你不再迷茫

信息安全领域越来越火&#xff0c;想要在这个行业闯出一片天&#xff1f;CISP认证就是你的“敲门砖”&#xff01;想知道如何顺利考取这个超牛的证书吗&#xff1f;下面就带你一起探索保姆级CISP报考流程&#xff01;&#x1f389; &#x1f393;报考条件&#x1f393; 学历专业…

推荐在线PS修图网页版工具PHP网站源码

在线PS修图网页版工具PHP网站源码&#xff0c;PHP在线照片图片处理PS网站程序源码photoshop网页版。 有很多朋友们都是在用PS作图的&#xff0c;众所周知在使用和学习PS时是需要下载软件的&#xff0c;Photoshop软件对电脑配置也是有一定要求的&#xff0c;今天就为大家带来一…

牛客网-----跳石头

题目描述&#xff1a; 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行&#xff0c;河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间&#xff0c;有N块岩石(不含起点和终点的岩石)。在比赛过程中&#xff0…

JAVA算法—排序

目录 *冒泡排序&#xff1a; *选择排序&#xff1a; 插入排序&#xff1a; 快速排序&#xff1a; 总结&#xff1a; 以下全部以升序为例 *冒泡排序&#xff1a; 引用&#xff1a; 在完成升序排序时&#xff0c;最大的元素会经过一轮轮的遍历逐渐被交换到数列的末尾&#…

项目实战——Qt实现FFmpeg音视频转码器

文章目录 前言一、移植 FFmpeg 相关文件二、绘制 ui 界面三、实现简单的转码四、功能优化1、控件布局及美化2、缩放界面3、实现拖拽4、解析文件5、开启独立线程6、开启定时器7、最终运行效果 五、附录六、资源自取 前言 本文记录使用 Qt 实现 FFmepg 音视频转码器项目的开发过…

Kubernetes/k8s之HPA,命名空间资源限制

Horizontal Pod Autoscaling:po的水平自动伸缩 这是k8s自带的模块 pod占用cpu比例达到一定的阀值&#xff0c;会触发伸缩机制。 根据cpu的阀值触发伸缩机制 replication controller 副本控制器 控制pod的副本数 deployment controller 节点控制器 部署pod hpa控制副本的数…

深度学习(3)--递归神经网络(RNN)和词向量模型Word2Vec

目录 一.递归神经网络基础概念 二.自然语言处理-词向量模型Word2Vec 2.1.词向量模型 2.2.常用模型对比 2.3.负采样方案 2.4.词向量训练过程 一.递归神经网络基础概念 递归神经网络(Recursive Neural Network, RNN)可以解决有时间序列的问题&#xff0c;处理诸如树、图这样…

蓝桥杯(C++ 最大开支 优先队列)

优先队列&#xff1a; 蓝桥杯&#xff08;C 整数删除 优先队列 &#xff09;-CSDN博客 思路&#xff1a; 1、每个人依此选择项目&#xff0c;每个人选项目时都&#xff08;选择当下花费增加最多的项目&#xff09;&#xff0c;若项目i的门票价格为kxb&#xff0c;那么增加一个…

HTML+JavaScript-02

数组 JavaScript中的数组用于在单一变量存储多个值&#xff0c;其实跟java中的数组是一样的&#xff0c;都是通过索引来访问这些值的。 创建数组 方式一&#xff1a;&#xff08;推荐&#xff09; var cars ["北京现代", "丰田", "五菱宏光"…

EDA-数据探索-pandas自带可视化-iris

# 加载yellowbrick数据集 import os import pandas as pd FIXTURES os.path.join(os.getcwd(), "data") df pd.read_csv(os.path.join(FIXTURES,"iris.csv")) df.head()sepal_lengthsepal_widthpetal_lengthpetal_widthspecies05.13.51.40.2setosa14.93…