Python文件、文件夹操作汇总

目录

一、概览

二、文件操作

2.1 文件的打开、关闭

2.2 文件级操作

2.3 文件内容的操作

三、文件夹操作

四、常用技巧

五、常见使用场景

5.1 查找指定类型文件

5.2 查找指定名称的文件

5.3 查找指定名称的文件夹

5.4 指定路径查找包含指定内容的文件

一、概览

    ​在工作中经常会遇到对文件,文件夹操作,在文件使用多时,使用python脚本是一种很便捷的方法,也可以实现一些工具如everything,notepad++无法实现的功能,更加灵活。本文将针对相关的基础操作进行介绍以及演示,其他的各种场景也都是基础操作的组合。

    ​注:文章演示例子为window系统下的操作,python版本3.8.3,linux下类似,主要是路径格式和文件权限存在较大差异

二、文件操作

2.1 文件的打开、关闭

import os
#文件的打开、关闭
#方法一 使用open
file=open(r"C:\Users\ZYP_PC\Desktop\verilog_test\counter\counter.v",encoding="utf-8")  #打开一个存在的文件counter.v,打开的编码格式为UTF-8,读取文件乱码内容大概率就是编码格式设置的不对,文件对象赋值给file
print("content:", file)
file2=open(r"C:\Users\ZYP_PC\Desktop\verilog_test\counter\test.v","a") #打开文件test.v,文件如果不存在时会自动创建test.v
file.close()      #文件的关闭
#方法二 使用with
with open(r"C:\Users\ZYP_PC\Desktop\verilog_test\counter\counter.v") as f:  #使用with相比方法一,会在执行完后自动释放资源,不会造成资源占用浪费print("content:",f)

open函数打开文件各选项配置参数含义

 

2.2 文件级操作

文件级操作主要包括文件的创建,删除,重命名,复制,移动。

import os
import shutil
#文件的创建,使用open打开要创建的文件,使用参数w即可,如指定路径下创建file.txt
with open(r"C:\Users\ZYP_PC\Desktop\verilog_test\counter\file.txt",'w'):#文件删除
os.remove(r"C:\Users\ZYP_PC\Desktop\verilog_test\counter\file.txt")#重命名,将file.txt重命名为file_rename.txt
os.rename(r"C:\Users\ZYP_PC\Desktop\verilog_test\counter\file.txt",r"C:\Users\ZYP_PC\Desktop\verilog_test\counter\file_rename.txt")#复制文件使用shutil库的copy函数,如将file.txt复制一份到上一级目录Verilog_test中,如果目标路径存在同名文件,则将其覆盖
source=r'C:\Users\ZYP_PC\Desktop\verilog_test\counter\file.txt'
dest=r"C:\Users\ZYP_PC\Desktop\verilog_test"
shutil.copy(source,dest)     #复制后文件的更新时间为复制的时间
# shutil.copy(source,dest)    #可保留复制后文件的原始创建时间等信息 #移动文件使用shutil库的move函数,如将file.txt移动到目录中counter中
source=r'C:\Users\ZYP_PC\Desktop\verilog_test\file.txt'
dest=r"C:\Users\ZYP_PC\Desktop\verilog_test\counter"
shutil.move(source,dest)        #需注意,如果目的路径已存在文件,会移动失败,此时可见对同名文件进行判断

2.3 文件内容的操作

文件内容的常用操作包括读取,查找,增加,删除,修改

import os
import shutil
import re
#文件内容的读取
with open(r"C:\Users\ZYP_PC\Desktop\verilog_test\counter\counter.v",'r') as f:all=f.read()   #将整个文件内容作为一个字符串读取print(all)#对单行按字符逐个读取,默认第一行for line in f.readline(5):  #可设置读取字符数,如示例读取前5各字符print(line)# 逐行读取文件内容for lines in f.readlines(): #读取的结果f.readlines()为整个文件内容按行为单位的listprint(lines)#内容查找
#指定路径查找包含字符module的行
#方法1 使用字符匹配方法in
pattern = 'module'
path=r'C:\Users\ZYP_PC\Desktop\verilog_test\counter'
with open(path, 'r') as file:for line in file:if pattern in line:print(line)    #打印查找到位置所在行
#方法2,使用正则匹配
pattern = 'module'
path=r'C:\Users\ZYP_PC\Desktop\verilog_test\counter'
with open(path, 'r') as f:for line in f:if re.search(pattern, line):print(line)     #打印查找到位置所在行#内容修改
#方法1,使用字符自带的replace函数
new_str="new"   #替换的字符
old_str="old"   #原始字符
path = r'C:\Users\ZYP_PC\Desktop\verilog_test\counter\counter.v'
content=""
with open(path, "r", encoding="utf-8") as f:for line in f:if old_str in line:line = line.replace(old_str,new_str)content += line
with open(path,"w",encoding="utf-8") as f:  f.write(content)    #将修改的内容写入文件中#方法2,使用正则表达中的sub函数
new_str="new"   #替换的字符
old_str="old"   #原始字符
content=""
path = r'C:\Users\ZYP_PC\Desktop\verilog_test\counter\counter.v'
with open(path, "r", encoding="utf-8") as f:for line in f:if old_str in line:print(line)line=re.sub(old_str,new_str,line)   #使用sub函数进行替换content += line
with open(path,"w",encoding="utf-8") as f:  #将修改的内容写入文件中f.write(content)#内容删除,与内容修改类似,将新的替换字符修改为“”即可,内容增加类似

三、文件夹操作

文件夹常见操作包括创建,删除,查找,重命名,复制,移动

import shutil
import re
from pathlib import Path
import glob##指定路径下创建文件夹
#方法1
path = r"C:\Users\ZYP_PC\Desktop\verilog_test\counter"
folder = "new_folder"
os.mkdir(os.path.join(path, folder))       #如果已存在同名文件则会报错
os.makedirs(os.path.join(path, folder),exist_ok=True)   #如果已存在同名文件则跳过
#方法2
path = Path(r"C:\Users\ZYP_PC\Desktop\verilog_test\counter")
folder = "new_folder"
new_folder_path = path / folder
new_folder_path.mkdir()##文件夹删除,删除文件夹counter_bak
path = r"C:\Users\ZYP_PC\Desktop\verilog_test\counter_bak"
shutil.rmtree(path)##文件夹复制,
#方法1,使用shutil库,推荐使用该方法
new_path=r"C:\Users\ZYP_PC\Desktop\verilog_test\counter_new"
old_path=r"C:\Users\ZYP_PC\Desktop\verilog_test\counter"
if os.path.exists(new_path):  #先对新文件夹进行判断是否已存在,已存在的进行复制会报错print("文件夹已存在")
shutil.copytree(old_path,new_path)  #counter目录下所有文件复制到counter_new下,如果counter_new不存在,则会先创建##文件夹改名,和文件改名操作相同,将counter文件夹改名为counter_rename
old_name=r"C:\Users\ZYP_PC\Desktop\verilog_test\counter"
new_name=r"C:\Users\ZYP_PC\Desktop\verilog_test\counter_rename"
os.rename(old_name,new_name)##文件夹移动,将counter文件夹移动到Desktop目录中
old_path=r"C:\Users\ZYP_PC\Desktop\verilog_test\counter"
new_path=r"C:\Users\ZYP_PC\Desktop"
if os.path.exists(old_path):             #先对复制的文件夹进行是否存在进行判断shutil.move(old_path,new_path)
else:print("源文件不存在")

四、常用技巧

下面将一些在文件,文件夹操作中经常需要用到的函数进行介绍,部分在前面的例子中已经涉及。

import os
import shutil
import re
from pathlib import Path
import glob
##返回当前的工作目录
current_path=os.getcwd()
print(current_path)##判断路径是否有效,可为文件夹路径或文件路径
dir_path=r"C:\Users\ZYP_PC\Desktop\verilog_test\counter"
file_path=r"C:\Users\ZYP_PC\Desktop\verilog_test\counter\counter.v"
print(os.path.exists(file_path))  #路径有效则返回true,否则返回false##文件、文件夹的判断
#方法1
path=r"C:\Users\ZYP_PC\Desktop\verilog_test\counter22"
print(os.path.isfile(path))   #判断给定的path是否是文件,是返回True,不是返回False
print(os.path.isdir(path))    #判断给定的path是否是文件夹,是返回True,不是返回False
#方法2 使用pathlib库中的函数Path
path = Path(r'C:\Users\ZYP_PC\Desktop\verilog_test\counter')
path.is_file()   #判断给定的path是否是文件,是返回True,不是返回False
path.is_dir()   #判断给定的path是否是文件夹,是返回True,不是返回False
#方法3 使用path的splittext函数,前提需先进行路径有效性判断
path=r"C:\Users\ZYP_PC\Desktop\verilog_test\counter\counter_v"
if os.path.exists(path):print("path路径有效")file_name, suffix = os.path.splitext(path)  # splitext将返回文件名和后缀,如果type不为空说明为文件,为空则为文件夹,前提是path是存在的,否则会误判if suffix:print("这是一个文件")else:print("这是一个文件夹")
else:print("path是一个无效地址")##给定一个目录,返回该目录下所有文件的路径,返回结果为列表
path = Path(r'C:\Users\ZYP_PC\Desktop\verilog_test\counter')
files = glob.glob(os.path.join(path, '*'))
print(files)##路径拼接,将多个路径拼接成一个路径
#方法1,使用字符串带的join函数
path1=r"C:\Users\ZYP_PC\Desktop\verilog_test\counter"
path2="counter.v"
abs_path=os.path.join(path1,path2)
print(abs_path)
#方法2,使用pathlib的Path函数
path1=Path(r"C:\Users\ZYP_PC\Desktop\verilog_test\counter")
path2="counter.v"
abs_path=path1 / path2
print(abs_path)
#方法3,使用字符串直接连接
path1=r"C:\Users\ZYP_PC\Desktop\verilog_test\counter"
path2="counter.v"
abs_path=path1+'\\'+path2   #中间的\\需根据path1是否包含来决定是否需要
print(abs_path)##文件夹遍历
#方法1 使用os.walk函数
path=r"C:\Users\ZYP_PC\Desktop\verilog_test\project_0307"
for root,dirs,file in os.walk(path):  #root为当前目录,dirs为当前目录所有的文件夹列表,file为当前目录的所有文件列表print("root:",root)print("dirs:",dirs)print("file:",file)
#方法2 使用os.listdir函数,和os.walk的区别是不会遍历子目录,要实现递归遍历需要定义函数实现
path=r"C:\Users\ZYP_PC\Desktop\verilog_test\project_0307"
for file in os.listdir(path):  #root为当前目录,dirs为当前目录所有的文件夹列表,file为当前目录的所有文件列表abs_path=os.path.join(path,file)print("abs_path:",abs_path)
#方法3 使用glob.glob函数,也不会遍历子目录,要实现递归遍历需要定义函数实现
path=r"C:\Users\ZYP_PC\Desktop\verilog_test\project_0307"
files=glob.glob(os.path.join(path,"*"))   #获取当前目录下所有的文件和文件夹
print("files:",files)

五、常见使用场景

5.1 查找指定类型文件

指定目录下查询所有的txt文件,返回查找到的文件路径,以列表形式保存

import os# 查询指定目录下指定类型的文件,返回查找到结果的绝对路径
def find_type(path,type):file_find=[]for root,dirs,files in os.walk(path):   #获取指定目录下的所有文件for file in files:if file.endswith(".txt"):file_find.append(os.path.join(root, file))print("files:",file_find)
path=r"C:\Users\ZYP_PC\Desktop\verilog_test\project_0307"
suffix=".txt"
find_type(path,suffix)        #以查找目录project_0307下的所有txt文件为例

查询结果

 

5.2 查找指定名称的文件

和5.1的类似,主要是if后的判断条件进行修改,如在project_0307目录下查找counter_tb.v文件

def find_file(path,f_name):file_find=[]for root,dirs,files in os.walk(path):   #获取指定目录下的所有文件for file in files:if file==f_name:          #判断条件进行替换,替换为文件名称查找file_find.append(os.path.join(root, file))print("files:",file_find)
path=r"C:\Users\ZYP_PC\Desktop\verilog_test\project_0307"
file="counter_tb.v"
find_file(path,file)        #以查找目录project_0307下的counter_tb.v文件为例

查询结果

 

5.3 查找指定名称的文件夹

以在目录project_0307下查找所有名称为sim_1的文件夹为例

# 查询指定目录下指定名称的文件夹,返回查找到结果的绝对路径
def find_dir(path,dir_name):folder_find=[]for root,dirs,files in os.walk(path):   #获取指定目录下的所有文件,文件夹for dir in dirs:if dir==dir_name:folder_find.append(os.path.join(root, dir))print("find_result:",folder_find)
path=r"C:\Users\ZYP_PC\Desktop\verilog_test\project_0307"
dir_name="sim_1"
find_dir(path,dir_name)        #以查找目录project_0307下所有名称为sim_1的文件夹为例

查找结果

 

5.4 指定路径查找包含指定内容的文件

以在目录project_0307下查找包含字符FPGA的log文件

def find_file(path,suffix,content):file_find=[]for root,dirs,files in os.walk(path):   #获取指定目录下的所有文件for file in files:if file.endswith(suffix):          #判断条件进行替换,替换为文件名称查找abs_path=os.path.join(root, file)with open(abs_path,"r") as f:for line in f:if content in line:file_find.append(abs_path)print("files:",file_find)
path=r"C:\Users\ZYP_PC\Desktop\verilog_test\project_0307"   #查找目录
suffix=".log"   #查找的文件类型为log类型
content="FPGA"  #文件中包含字符FPGA
find_file(path,suffix,content)        #以查找目录project_0307下的counter_tb.v文件为例

查找结果

 

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

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

相关文章

照片放大软件 Topaz Gigapixel AI mac中文版简介

Topaz Gigapixel AI mac是一款使用人工智能功能扩展图像的桌面应用程序,同时添加自然细节以获得惊人的效果。使用深度学习技术,A.I.Gigapixel™可以放大图像并填写其他调整大小的产品遗漏的细节,使用A.I.Gigapixel™,您可以裁剪照…

LeetCode 面试题 16.20. T9键盘

文章目录 一、题目二、C# 题解 一、题目 在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表。每个数字映射到0至4个字母。给定一个数字序列,实现一个算法来返回匹配单词的列表。你会得到一张含有有效单词的列表。映射…

Xilinx FPGA平台DDR3设计详解(一):DDR SDRAM系统框架

DDR SDRAM(双倍速率同步动态随机存储器)是一种内存技术,它可以在时钟信号的上升沿和下降沿都传输数据,从而提高数据传输的速率。DDR SDRAM已经发展了多代,包括DDR、DDR2、DDR3、DDR4和DDR5,每一代都有不同的…

【Unity之UI编程】编写一个面板交互界面需要注意的细节

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

LeetCode146.LRU缓存

写了一个小时,终于把示例跑过了,没想到啊提交之后第19/22个测试用例没过 我把测试用例的输出复制在word上看看和我的有什么不同,没想到有18页的word,然后我一直检查终于找出了问题,而且这个bug真的太活该了&#xff0c…

YOLOv5算法进阶改进(1)— 改进数据增强方式 + 添加CBAM注意力机制

前言:Hello大家好,我是小哥谈。本节课设计了一种基于改进YOLOv5的目标检测算法。首先在数据增强方面使用Mosaic-9方法来对训练集进行数据增强,使得网络具有更好的泛化能力,从而更好适用于应用场景。而后,为了更进一步提升检测精度,在backbone中嵌入了CBAM注意力机制模块,…

javaEE案例,前后端交互,计算机和用户登录

加法计算机,前端的代码如下 : 浏览器访问的效果如图 : 后端的代码如下 再在浏览器进行输入点击相加,就能获得结果 开发中程序报错,如何定位问题 1.先定位前端还是后端(通过日志分析) 1)前端 : F12 看控制台 2)后端 : 接口,控制台日志 举个例子: 如果出现了错误,我们就在后端…

devops完整搭建教程(gitlab、jenkins、harbor、docker)

devops完整搭建教程(gitlab、jenkins、harbor、docker) 文章目录 devops完整搭建教程(gitlab、jenkins、harbor、docker)1.简介:2.工作流程:3.优缺点4.环境说明5.部署前准备工作5.1.所有主机永久关闭防火墙…

mysql基础 --子查询

文章目录 子查询子查询案例 子查询 一个查询语句,嵌套在另一个查询语句内部;子查询先执行,其结果被外层主查询使用;子查询放入括号内;子查询放在比较条件的右侧;子查询返回一条,为单行子查询(对…

【云备份|| 日志 day6】文件业务处理模块

云备份day6 业务处理 业务处理 云备份项目中 ,业务处理模块是针对客户端的业务请求进行处理,并最终给与响应。而整个过程中包含以下要实现的功能: 借助网络通信模块httplib库搭建http服务器与客户端进行网络通信针对收到的请求进行对应的业…

一文搞懂设计模式之单例模式

大家好,我是晴天,本周我们一起来学习单例模式。本文将介绍单例模式的基本属性,两种构造单例的方法(饿汉模式和懒汉模式)以及golang自带的sync.Once()方法。 什么是单例模式 GoF对单例模式的定义是:保证一个…

微信小程序隐私政策不合规,应当由用户自主阅读后自行选择是否同意隐私政策协议,不得默认强制用户同意

小程序隐私政策不合规,默认自动同意《用户服务协议》及《隐私政策》,应当由用户自主阅读后自行选择是否同意隐私政策协议,不得默认强制用户同意,请整改后再重新提交。 把 登录代表同意《用户协议》和《隐私政策》 改为 同意《用…