文件操作与管理

news2024/11/18 17:22:05

程序经常需要访问文件和目录,读取文件信息或写入文件信息,在Python语言中对文件的读写是通过文件对象(file object)实现的。Python的文件对象也称为类似文件对象或流(stream),因为Python提供一种类似于文件操作的API实现对底层资源的访问。文件对象可以是实际的磁盘文件,也可以是其他存储或通信设备,如内存缓冲区、网络、键盘和控制台。

文件操作

打开文件

文件对象可以通过 open()函数获得。open()函数是 Python 内置函数,它屏蔽了创建文件对象的细节,使得创建文件对象变得简单。open()函数语法如下:

open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)

其中file、mode 和 encoding 是最常用的参数,其它参数很少使用。

(1)file参数

file参数是要打开的文件,可以是字符串或整数。如果 file 是字符串表示文件名,文件名可以是相对路径,也可以是绝对路径;如果 file 是整数表示文件描述符,文件描述符指向一个已经打开的文件(文件描述符是一个整数值,它对应到当前程序已经打开的一个文件。例如标准输入文件描述符为0,标准输出文件描述符为1,标准错误文件描述符为2,打开其他文件的文件描述符依次是3、4、5等数字)。

(2)mode参数

mode 参数用来设置文件打开模式

文件打开模式参数
字符串说明
r只读模式打开(默认)
w写入模式打开文件,会覆盖已经存在的文件
x独占创建模式,如果文件不存在则创建并以写入模式打开文件,如果文件已存在则抛出异常 FileExistsError
a追加模式,如果文件存在,写入内容追加到文件末尾
b二进制模式
t文本模式(默认)
+更新模式

注意:

  1. b 和 t 是文件类型模式,如果是二进制文件需要设置 rb、wb、xb、ab,如果是文本文件需要设置 rt、wt、xt、at,由于 t 是默认模式,因此可以省略为 r、w、x、a。
  2. +必须与 r、w、x 和 a 组合使用来设置文件为读写模式,对于文本文件可以使用 r+、w+、x+ 和 a+,对于二进制文件可以使用 rb+、wb+、xb+ 和 ab+。
  3. r+、w+、和 a+ 的区别:r+ 打开文件时如果文件不存在则抛出异常;w+ 打开文件时如果文件不存在则创建文件,文件存在则清除文件内容;a+打开文件时如果文件不存在则创建文件,文件存在则在文件末尾追加。

(3)buffering参数

使用缓冲区可以提高效率减少 IO 操作,文件数据首先被放到缓冲区中,当文件关闭或刷新缓冲区时,数据才会真正写入到文件中。buffering 是设置缓冲区策略,默认值为 -1,此时系统会自动设置缓冲区,通常是 4096 字节或 8192 字节;buffering=0 时关闭缓冲区,此时数据会直接写入到二进制文件中,这种模式主要应用于二进制文件的写入操作;当buffering>0时,buffering 用来设置缓冲区字节大小。

(4)encoding 参数 和 errors 参数

encoding 用来指定打开文件时的文件编码,主要用于文本文件的打开。errors 参数用来指定编码发生错误时如何处理。

(5)newline参数

用来设置换行模式

(6)closefd 参数和 opener 参数

这两个参数在 file 参数为文件描述符时使用。closefd 为True 时,文件对象调用close()关闭文件,同时也会关闭文件描述符;closefd 为 为 False 时,文件对象调用close()方法关闭文件,但文件描述符不会关闭。opener参数用于打开文件时执行的一些加工操作,opener 参数执行一个函数,该函数返回一个文件描述符。

可以看到此时我的项目中是没有“a.txt”文件

示例代码如下

#由于a.txt文件不存在,会创建文件,且文件内容为写入的World
with open("a.txt","w+") as f:
    f.write('World')

#此时为r+,会覆盖文件内容为Hello
with open("a.txt","r+") as f:
    f.write('Hello')
    
#此时为a+,会在文件原内容的末尾增加 World
with open("a.txt","a+") as f:
    f.write(' ')
    f.write("World")

代码运行结果

可以看到结果为我们输入的“Hello World”字符,且新建了一个 a.txt 文件 

关闭文件 

当使用 open()函数打开文件后,若不再使用文件应该调用文件对象的close()方法关闭文件。文件的操作往往会抛出异常,为了保证文件操作无论正常结束还是异常结束都能关闭文件,调用close()方法应该放在异常处理的finally代码块中,也可以用 with as 代码块进行自动资源管理。(推荐)

示例代码如下

f_name = "a.txt"

try:
    f = open("a.txt")
except OSError as e:
    print('打开文件失败')
else:
    print('打开文件成功')
    try:
        content = f.read()
        print(content)
    except OSError as e:
        print('处理OS异常')
    finally:
        f.close()

该段代码中使用了两个try语句,其中 finally 没有与第一个 try 语句匹配,是因为如果文件打开失败,则 f =None,此时再关闭文件会引发异常。

代码运行结果

打开文件成功
Hello World

Process finished with exit code 0

文本文件读写

 文本文件读写的单位是字符,需要考虑编码问题

文本文件读写主要方法
方法名说明
read(size=-1)从文件中读取字符串,size 限制最多读取的字符数,size=-1表示没有限制,读取全部内容
readline(size=-1)读取到换行符或文件末尾并返回单行字符串,如果已经到文件尾,则返回一个空字符串,size 限制最多读取的字符数,size=-1表示没有限制
readlines()读取文件数据到一个字符串列表中,每个行数据是列表的一个元素
write(s)将字符串 s 写入文件,并返回写入的字符数
writelines(lines)向文件中写入一个列表,不添加行分隔符,因此通常为每一行末尾提供分隔符
flush()刷新写缓冲区,数据会写入文件中

首先在项目中新建一个“text.txt”文件,并写入相关内容

示例代码如下

with open("text.txt",'r',encoding="utf-8") as f:
    '''
    使用 f.readlines(),它将返回一个包含每一行作为元素的列表
    lines 是一个列表,其中包含了文件的每一行
    使用 for 循环遍历这个列表,并打印每一行
    print(line, end='') 确保在打印时不会添加额外的换行符
    '''
    lines = f.readlines()
    for line in lines:
        print(line,end="")
    # 复制文件内容到copy_name文件中
    with open("copy.txt","w",encoding="utf-8") as file:
        file.writelines(lines)
        print()
        print('文件复制成功')
        print("接下来文查看文件内容")
# 打印复制的文件内容
with open("copy.txt","r",encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines:
        print(line,end="")

代码运行结果

这是一段用于测试的文字1
这是一段用于测试的文字2
这是一段用于测试的文字3
文件复制成功
接下来文查看文件内容
这是一段用于测试的文字1
这是一段用于测试的文字2
这是一段用于测试的文字3
Process finished with exit code 0

二进制文件读写

二进制文件读写的单位是字节,不需要考虑编码问题

示例代码如下

with open("CSDN.png",'rb') as f:
    b = f.read()
    with open("copy.png",'wb') as copy_f:
        copy_f.write(b)
        print("文件复制成功")

代码运行结果

os模块

Python对文件的操作是通过文件对象实现的,文件对象属于 Python 的 io 模块。如果想要通过Python程序管理文件或目录,如删除文件、修改文件名、创建目录、删除目录和遍历目录等,可以通过Python的 os 模块实现。

os 模块提供了使用操作系统功能的一些函数,如文件与目录管理。

os模块与文件和目录管理相关的函数
函数、属性名说明
os.rename(src,dst)修改文件名,src为源文件,dst为目标文件,他们都可以是相对当前路径或绝对路径表示的文件
os.remove(path)删除path所指的文件,如果path是目录,则会引发OSError
os.mkdir(path)

创建path所指的目录,如果目录已存在,则会引发FileExistsError

os.rmdir(path)删除path所指的目录,如果目录非空,则会引发OSError
os.walk(top)遍历top所指的目录树,自顶向下遍历目录树,返回值是一个有三个元素的元组(目录路径,目录名列表,文件名列表)
os.listdir(dir)列出指定目录中的文件和子目录
os.curdir属性获得当前目录
os.pardir属性获得当前父目录

示例代码如下

import os

# 读取text.txt中的全部内容并复制给copy.txt
with open("text.txt",'r',encoding="utf-8") as f:
    b = f.read()
    with open("copy.txt",'w',encoding="utf-8") as copyfile:
        copyfile.write(b)

# 修改copy.txt文件名为 copy2.txt
try:
    os.rename("copy.txt","copy2.txt")
except OSError:
    os.remove("copy2.txt")

# 创建目录
try:
    os.mkdir('subdir')
except OSError:
    os.rmdir('subdir')

#遍历目录
for item in os.walk('.'):
    print(item)

代码运行结果

os.path模块

对于文件和目录的操作往往需要路径,Python提供的 os.path模块提供对路径、目录和文件等进行管理的函数。

os.path模块常用函数
函数名说明
os.path.abspath(path)返回 path 的绝对路径
os.path.basename(path)返回 path路径的基础名部分,如果path指向的是一个文件,则返回文件名;如果path指向的是一个目录,则返回最后目录名
os.path.dirname(path)返回path路径中目录部分
os.path.exists(path)判断path文件是否存在
os.path.isfile(path)如果path是文件,则返回True
os.path.isdir(path)如果path是目录,则返回True
os.path.getatime(path)返回最后一次的访问时间,返回值是一个UNIX时间戳(1970年1月1日00:00:00以来至现在的总秒数),如果文件不存在则无法访问,会引发OSError
os.path.getctime(path)返回创建时间,返回值是一个UNIX时间戳,如果文件不存在或无法访问,则引发OSError
os.path.getsize(path)返回文件大小,以字节为单位,如果文件不存在则无法访问,会引发OSError

示例代码如下

import os.path
from datetime import datetime

f_name = 'text.txt'
af_name = r'D:\creation\PythonStudy\Pythonproject\mypro01\text.txt'

# 返回路径中基础名部分
basename = os.path.basename(af_name)
print(basename)

# 返回路径中目录部分
dirname = os.path.dirname(af_name)
print(dirname)

#返回文件的绝对路径
print(os.path.abspath(f_name))

#返回文件大小
print(os.path.getsize(f_name))
#返回最近访问时间
atime = datetime.fromtimestamp(os.path.getatime(f_name))
print(atime)
#返回创建时间
ctime = datetime.fromtimestamp(os.path.getctime(f_name))
print(ctime)
#返回修改时间
mtime = datetime.fromtimestamp(os.path.getmtime(f_name))
print(mtime)

代码运行结果

text.txt
D:\creation\PythonStudy\Pythonproject\mypro01
D:\creation\PythonStudy\Pythonproject\mypro01\text.txt
106
2024-06-30 11:01:22.267132
2024-06-25 10:06:21.804224
2024-06-25 15:44:00.648589

Process finished with exit code 0

参考书籍:《python从小白到大牛》(第2版)关东升 编著 


文章创作不易,本文接近6000字,为了大家能理解,写的很详细,这也让我花了很多时间。最后,如果觉得本文对大家有帮助的话,还请给我点个赞和关注,谢谢大家!!!

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

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

相关文章

13_网络安全

目录 网络安全协议 网络安全协议 PGP协议 网络安全技术 防火墙技术 入侵检测系统 入侵防御系统 杀毒软件 蜜罐系统 计算机病毒与木马 网络安全协议 网络安全协议 物理层主要使用物理手段隔离、屏蔽物理设备等,其他层都是靠协议来保证传输的安全&#xff…

【python刷题】蛇形方阵

题目描述 给出一个不大于 99 的正整数n,输出n*n的蛇形方阵。从左上角填上1开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用3个字符,前面使用空格补齐。 输入 输入一个正整数n,含义如题所述 输出 输出符合…

ITK-二值阈值分割

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 什么是二值阈值分割? 二值阈值分割是一种常见的图像处理技术,用于将图像的像素值分成两个类别&#xff1…

基于GTX的64B66B编码的自定义协议发送模块(高速收发器二十一)

点击进入高速收发器系列文章导航界面 1、64B66B组帧原理 前文讲解64B66B编码原理时,已经讲解过组帧的原理,包括数据帧和控制帧两种,区别在于同步码不同。 下图是802.3的以太网控制协议,其中S表示起始位,T表示停止位。为…

LINUX系统编程:多线程互斥

目录 1.铺垫 2.线程锁接口的认识 静态锁分配 动态锁的分配 互斥量的销毁 互斥量加锁和解锁 3.加锁版抢票 4.互斥的底层实现 1.铺垫 先提一个小场景,有1000张票,现在有4个进程,这四个进程疯狂的去抢这1000张票,看看会发生什…

熊猫烧香是什么?

熊猫烧香(Worm.WhBoy.cw)是一种由李俊制作的电脑病毒,于2006年底至2007年初在互联网上大规模爆发。这个病毒因其感染后的系统可执行文件图标会变成熊猫举着三根香的模样而得名。熊猫烧香病毒具有自动传播、自动感染硬盘的能力,以及…

简单爬虫案例——爬取快手视频

网址:aHR0cHM6Ly93d3cua3VhaXNob3UuY29tL3NlYXJjaC92aWRlbz9zZWFyY2hLZXk9JUU2JThCJTg5JUU5JTlEJUEy 找到视频接口: 视频链接在photourl中 完整代码: import requestsimport re url https://www.kuaishou.com/graphql cookies {did: web_…

C语言 | Leetcode C语言题解之第207题课程表

题目&#xff1a; 题解&#xff1a; bool canFinish(int numCourses, int** prerequisites, int prerequisitesSize, int* prerequisitesColSize) {int** edges (int**)malloc(sizeof(int*) * numCourses);for (int i 0; i < numCourses; i) {edges[i] (int*)malloc(0);…

一点连接千家银行,YonSuite让“银企对账”一键确认

在当今数智化浪潮下&#xff0c;成长型企业面临着前所未有的机遇与挑战。特别是在与银行的对接以及银企对账等方面&#xff0c;传统的手动操作模式已难以满足企业高效、安全的金融管理需求。用友YonSuite作为一款全场景SaaS应用服务&#xff0c;凭借其强大的银企直联功能&#…

【C++ 初阶路】--- C++内存管理

目录 一、C/C内存分布二、C内存管理方式2.1 new/delete操作内置类型2.2 new和delete操作自定义类型 三、operator new与operator delete函数四、new和delete的实现原理4.1 内置类型4.2 自定义类型 一、C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Tes…

树立行业标杆,林清轩获“以油养肤开创者”市场地位认证

从0到1的创造&#xff0c;才能快速实现从1到100的裂变&#xff0c;这是亘古不变的商业逻辑。 6月25日&#xff0c;知名美妆国货品牌林清轩&#xff0c;获得了CIC灼识的市场地位确认书&#xff0c;确定“以油养肤开创者” 的地位。 近两年&#xff0c;以油养肤的概念逐渐兴起&am…

【Python】入门Python,你必须了解这些事

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言一、认识Python什么是Python&#xff1f;!Python的起源Python的特点简洁易读跨平台&#xff0c;可移植拥有强大的库和框架面向对象 Python的优缺点优点缺点 Python的应用环境扩…

【第六节】C/C++静态查找算法

目录 前言 一、搜索查找 二、查找算法 1. 线性查找&#xff08;Linear Search&#xff09; 2. 二分查找&#xff08;Binary Search&#xff09; 3. 插值查找&#xff08;Interpolation Search&#xff09; 4. 哈希查找&#xff08;Hash Search&#xff09; 5. Fibonacc…

气膜足球馆需要投资多少—轻空间

随着足球运动的普及和人们对健康生活方式的追求&#xff0c;建设高质量的足球场地成为许多城市和社区的需求。在众多建设方案中&#xff0c;气膜足球馆因其独特的优势&#xff0c;逐渐成为一种受欢迎的选择。轻空间将探讨建设气膜足球馆所需的投资情况&#xff0c;并分析其成本…

InnoDB 表空间2---系统表空间

系统表空间 了解完了独立表空间的基本结构&#xff0c;系统表空间的结构也就好理解多了&#xff0c;系统表空间的结构和独立表空间基本类似&#xff0c;只不过由于整个MySQL进程只有一个系统表空间&#xff0c;在系统表空间中会额外记录一些有关整个系统信息的页&#xff0c;所…

MySQL之主从同步、分库分表

1、主从同步的原理 MySQL主从复制的核心是二进制日志 二进制日志&#xff08;binlog&#xff09;记录了所有DDL语句和DML语句&#xff0c;但不包括数据查询&#xff08;select、show&#xff09;语句。 1.1、复制分三步 master主库在事务提交时&#xff0c;会把数据变更记录…

干货分享:Spring中经常使用的工具类(提示开发效率)

环境&#xff1a;Spring5.3…30 1、资源工具类 ResourceUtils将资源位置解析为文件系统中的文件的实用方法。 读取classpath下文件 File file ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX "logback.xml") ; // ...读取文件系统文件 file Resou…

淘系-万相台无界实操运营课:淘系 付费工具课(40节课)

课程目录 01_万相台无界系统性忖费推广思维.mp4 02_万相台无界七大推广场景详解.mp4 03关键词推广计划之标准计划搭建技巧.mp4 04_关键词推广之智能计划推广技巧.mp4 05_关键词推广之趋势选品计划推广技巧.mp4 06关键词推广之智能选品计划推广技巧.mp4 07_非标品的关键词…

做好准备了吗?智能手机又一轮涨价潮来了……

还记得十一二年前&#xff0c;智能手机刚大力普及的时候&#xff0c;以小米、魅族为首的新势力品牌&#xff0c;快速打破三星、苹果及HTC们的高价门槛&#xff0c;将旗舰产品的价格快速压到了两千价位。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 一时间&#xff0c;手机市场快速完成了…

鸿蒙:路由Router原理

页面路由&#xff1a;在应用程序中实现不同页面之间的跳转和数据传递 典型应用&#xff1a;商品信息返回、订单等多页面跳转 页面栈最大容量为32个页面&#xff0c;当页面需要销毁可以使用router.clear()方法清空页面栈 router有两种页面跳转模式&#xff1a; router.pushUrl…