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 os

file_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 os

file_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 os

file_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 = None
    try:
        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 = None
	try:
		f = open(file_name,'r',encoding='utf-8')
		while f:
			r = f.readline()
			if r:
				print(r)
			else:
				break
	except 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 = None
	try:
		f = open(file_name,'r',encoding='utf-8')
		r = f.readlines()
		print(r)   # ['这是文本第1行。\n', '这是文本第2行。\n', '这是文本第3行。\n']
        for i in r: # 通过循环遍历这个list
						print(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,否则返回False
			print('文件已关闭')

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 = None
	try:
		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... 来改造简化

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[docker] Docker 基本管理

一、Docker 相关知识 1.1 Docker概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻…

中国工业设计行业现状及趋势

近几年来&#xff0c;我国工业设计产业的规模不断扩大&#xff0c;逐渐渗透到人们的日常生活当中&#xff0c;企业在通过对市场的需求方面可以对产品的设计方向进行了解&#xff0c;通过以人为本的设计理念&#xff0c;提高我国工业设计产业的总体实力。目前我国工业出口总额为…

navicat数据库密码解密

1、打开 https://tool.lu/coderunner/ 在线工具 2、输入代码 <?php namespace FatSmallTools; class NavicatPassword {protected $version 0;protected $aesKey libcckeylibcckey;protected $aesIv libcciv libcciv ;protected $blowString 3DC5CA39;protected $blow…

vue3 项目中 arguments 对象获取失败问题

问题 在 vue3 项目中 获取到的 arguments 对象与传入实参不符&#xff0c;打印出函数中的 arguments 对象显示如下&#xff1a; 原因 作者仔细回看代码才发现&#xff0c;自己一直用的是 vue3 的组合式写法&#xff0c;函数都是箭头函数&#xff0c;而箭头函数不存在 argumen…

Windows脚本:监控并自动重启某个进程

Windows脚本&#xff1a;监控自动并重启某个进程 一、简介二 .bat脚本方式2.1 编制脚本2.2 创建并运行脚本2.3 设置关闭cmd窗口 三、使用VBScript脚本方式3.1 编制脚本3.2 运行脚本 四、设置脚本开机自启动五、某些软件加入启动项后&#xff0c;开机不会自动启动的解决方法 在实…

Flink多流转换(1)—— 分流合流

目录 分流 代码示例 使用侧输出流 合流 联合&#xff08;Union&#xff09; 连接&#xff08;Connect&#xff09; 简单划分的话&#xff0c;多流转换可以分为“分流”和“合流”两大类 目前分流的操作一般是通过侧输出流&#xff08;side output&#xff09;来实现&…

Javaweb之SpringBootWeb案例本地存储的详细解析

2.2 本地存储 前面我们已分析了文件上传功能前端和后端的基础代码实现&#xff0c;文件上传时在服务端会产生一个临时文件&#xff0c;请求响应完成之后&#xff0c;这个临时文件被自动删除&#xff0c;并没有进行保存。下面呢&#xff0c;我们就需要完成将上传的文件保存在服…

ZigBee学习(一)

文章目录 一、ZigBee介绍1.1 ZigBee协议特点1.2 ZigBee协议体系结构1.3 ZigBee设备类型 二、IEEE 802.15.42.1 物理层2.2 MAC层2.3 如何实现网络和设备寻址2.4 能量管理 三、ZigBee网络拓扑结构四、ZigBee配置参数 一、ZigBee介绍 ZigBee是一种基于IEEE 802.15.4标准的高级通信…

网易云音乐JS逆向分析

文章目录 页面分析抓包分析JS逆向分析代码编写 页面分析 先来分析一下页面 当我们点击播放按钮的时候&#xff0c;音乐开始播放。实际上这个逻辑背后的原理是这个按钮后面对应的是一个url&#xff0c;这个地址是通过ajax来进行局部刷新的。 所以我们可以通过抓包工具&#…

防御保护----信息安全

网络安全概述 信息安全&#xff1a;防止任何对数据进行未授权访问的措施&#xff0c;或者防止造成信息有意无意泄露、破坏、丢失等问题的发生&#xff0c;让数据处于远离危险、免于威胁的状态和特性。 网络安全&#xff1a;计算机网络环境下的信息安全。 网络安全背景 网络空间…

Open3D 与 Point Cloud 处理

点云基础3D数据结构点云采集方法点云处理框架点云操作 Open3D基础操作 点云基础 3D数据结构 点云&#xff08;Point Cloud&#xff09;&#xff1a; 点云是由一组离散的点构成的三维数据集合&#xff0c;每个点都包含了坐标信息 (x, y, z) 、颜色 (RGB)、类别 (cls)、强度值等…

宝塔面板部署MySQL并结合内网穿透实现公网远程访问本地数据库

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cp…

梳理Langchain-Chatchat知识库API接口

一.Langchain-Chatchat 知识库管理 1.Langchain-Chatchat 对话和知识库管理界面 Langchain-Chatchat v0.28 完整的界面截图&#xff0c;如下所示&#xff1a; 2.知识库中源文件和向量库 知识库 test 中源文件和向量库的位置&#xff0c;如下所示&#xff1a; 3.知识库表结构 k…

超融合基础架构理解

1 超融合基础架构 1.1 定义 超融合基础架构&#xff08;Hyper-converged infrastructure&#xff0c;缩写为HCI&#xff09;&#xff0c;是一种集成了存储设备及虚拟运算的信息基础架构框架。在这样的架构环境中&#xff0c;同一厂商的服务器与存储等硬件单元&#xff0c;搭配…

比较有创意的网站

有创意的网站通常展示了独特的设计、交互或内容。以下是一些备受赞誉的有创意的网站&#xff0c;你可以参考&#xff1a; Awwwards: Awwwards 是一个评选并展示全球最优秀网站的平台。你可以在这里找到很多有创意的网站设计。 Awwwards CSS Design Awards: 类似于Awwwards&…

若依分页失败,由于对数据二次处理导致total只有十条

在使用若依框架的过程中&#xff0c;如果是查询结果数据直接返回&#xff0c;那么其自带的分页插件可以正常返回数据以及总条数&#xff0c;但若是对数据进行了其他二次处理&#xff0c;再返回就会出现异常&#xff0c;即无论查询了多少条&#xff0c;total都只会显示10&#x…

实现纯Web语音视频聊天和桌面分享(附源码,PC端+移动端)

在网页里实现文字聊天是比较容易的&#xff0c;但若要实现视频聊天&#xff0c;就比较麻烦了。本文将实现一个纯Web版的视频聊天和桌面分享的Demo&#xff0c;可直接在浏览器中运行&#xff0c;不需要安装任何插件。 一. 主要功能及支持平台 1.本Demo的主要功能有 &#xff…

CSAPP fall2015 深入理解计算机系统 Cache lab详解

Cache Lab cache lab 缓存实验 代码下载 从CSAPP上面下载对应的lab代码 http://csapp.cs.cmu.edu/3e/labs.html 环境准备 需要安装 valgrind。可以参考文章Valgrind centos。 安装好以后执行valgrind --version可以看到版本号。 Cache simulator cache simulator not a …