Python文件、文件夹操作汇总

news2025/1/11 6:10:47

目录

一、概览

二、文件操作

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()为整个文件内容按行为单位的list
        print(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.coloradmin.cn/o/1198986.html

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

相关文章

Least Square Method 最小二乘法(图文详解,必懂)

最小二乘法是一种求解线性回归模型的优化方法,其目标是最小化数据点和拟合直线之间的残差平方和。这意味着最小二乘法关注的是找到一个直线,使得所有数据点与该直线的偏差的平方和最小。在数学公式中,如果y是实际值,y是函数估计值…

头歌答案Python——JSON基础

目录 ​编辑 Python——JSON基础 第1关:JSON篇:JSON基础知识 任务描述 第2关:JSON篇:使用json库 任务描述 Python——XPath基础 第1关:XPath 路径表达式 任务描述 第2关:XPath 轴定位 任务描述…

计算机毕业设计:疲劳驾驶检测识别系统 python深度学习 YOLOv5 (包含文档+源码+部署教程)

[毕业设计]2023-2024年最新最全计算机专业毕设选题推荐汇总 1、项目介绍 基于YOLOv5的疲劳驾驶检测系统使用深度学习技术检测常见驾驶图片、视频和实时视频中的疲劳行为,识别其闭眼、打哈欠等结果并记录和保存,以防止交通事故发生。本文详细介绍疲劳驾…

2023-11-12 LeetCode每日一题(Range 模块)

2023-03-29每日一题 一、题目编号 715. Range 模块二、题目链接 点击跳转到题目位置 三、题目描述 Range模块是跟踪数字范围的模块。设计一个数据结构来跟踪表示为 半开区间 的范围并查询它们。 半开区间 [left, right) 表示所有 left < x < right 的实数 x 。 实…

服务号如何升级订阅号

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;首先我们要知道服务号和订阅号有什么区别。服务号侧重于对用户进行服务&#xff0c;每月可推送4次&#xff0c;每次最多8篇文章&#xff0c;发送的消息直接显示在好友列表中。订阅号更侧重于信息传…

利用移动性的比例公平蜂窝调度测量和算法

&#xff08;一支笔一包烟&#xff0c;一节论文看一天 &#xff09;&#xff08;一张纸一瓶酒&#xff0c;一道公式推一宿&#xff09; 摘要1. 引言2. 相关工作3. 模型和问题公式4. 预测FPF调度 &#xff08; P F &#xff09; 2 S &#xff08;PF&#xff09;^2S &#xff08;…

在线制作仿真病历证明软件,易语言实现病例报告生成器,取画板快照+标签+编辑框

闲着无聊用易语言开发了一个病例生成器&#xff0c;当然我加了水印的&#xff0c;这个图片你就算截图你也用不了&#xff0c;模板是从百度图库搜的&#xff0c;很多&#xff0c;我就随便找了一个&#xff0c;然后实现逻辑就是加了一个画板&#xff0c;然后载入了素材图&#xf…

常见面试题-Redis底层的SDS、ZipList、ListPack

Redis 的 SDS 了解吗&#xff1f; 答&#xff1a; Redis 创建了 SDS&#xff08;simple dynamic string&#xff09; 的抽象类型作为 String 的默认实现 SDS 的结构如下&#xff1a; struct sdshdr {// 字节数组&#xff0c;用于保存字符串char buf[];// buf[]中已使用字节…

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

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

中国国内机场信息集成系统厂家现状情况

机场信息集成系统在本世纪初进入中国市场&#xff0c;早期的信息集成系统提供商以外企为主&#xff0c;后来国内企业迅速发展。但在2008年前&#xff0c;民航总局设立了机场信息系统的入门门槛&#xff0c;也就是需要民航空管工程及机场弱电系统建设资质要求&#xff0c;该要求…

Linux学习教程(第二章 Linux系统安装)3

第二章 Linux系统安装 十一、Linux远程管理协议&#xff08;RFB、RDP、Telnet和SSH&#xff09; 提到远程管理&#xff0c;通常指的是远程管理服务器&#xff0c;而非个人计算机。个人计算机可以随时拿来用&#xff0c;服务器通常放置在机房中&#xff0c;用户无法直接接触到…

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

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

考研分享第2期 | 中央财经大学管理科学跨考北大软微金融科技406分经验分享

一、个人信息 本科院校&#xff1a;中央财经大学 管理科学与工程学院 管理科学专业 上岸院校&#xff1a;北京大学 软件与微电子学院 金融科技专业硕士 考试科目&#xff1a; 初试&#xff1a;思想政治理论 英语一 数学二 经济学综合 面试考察范围广&#xff0c;包括英语自…

代码随想录算法训练营第四十九天丨 动态规划part12

309.最佳买卖股票时机含冷冻期 思路 相对于动态规划&#xff1a;122.买卖股票的最佳时机II (opens new window)&#xff0c;本题加上了一个冷冻期 在动态规划&#xff1a;122.买卖股票的最佳时机II (opens new window)中有两个状态&#xff0c;持有股票后的最多现金&#xf…

头歌答案--爬虫实战

目录 urllib 爬虫 第1关&#xff1a;urllib基础 任务描述 第2关&#xff1a;urllib进阶 任务描述 requests 爬虫 第1关&#xff1a;requests 基础 任务描述 第2关&#xff1a;requests 进阶 任务描述 网页数据解析 第1关&#xff1a;XPath解析网页 任务描述 第…

算法导论6:摊还分析,显式与隐式

P258 摊还分析概念 聚合分析&#xff0c;利用它&#xff0c;我们证明对于n&#xff0c;一个n个操作的序列最坏情况下的花费的总时间为T(n)&#xff0c;因此&#xff0c;在最坏情况下&#xff0c;每个操作的平均代价&#xff08;摊还代价&#xff09;为T(n)/n 举了例子来形容这…

asp.net 在线音乐网站系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 在线音乐网站系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 asp.net 在线音乐网站系统1 应用…

pyorch Hub 系列#4:PGAN — GAN 模型

一、主题描述 2014 年生成对抗网络的诞生及其对任意数据分布进行有效建模的能力席卷了计算机视觉界。两人范例的简单性和推理时令人惊讶的快速样本生成是使 GAN 成为现实世界中实际应用的理想选择的两个主要因素。 然而&#xff0c;在它们出现后的很长一段时间内&#xff0c;GA…

Clickhouse学习笔记(8)—— 建表优化

数据类型 时间字段 建表时能用数值型或日期时间类型&#xff08;DateTime&#xff09;表示的字段就不要用字符串 因为clickhouse进行分区时一般使用时间字段来进行分区&#xff0c;而将时间字段使用DateTime表示&#xff0c;不需要经过函数转换处理&#xff0c;执行效率高、…

开放领域问答机器人2——开发流程和方案

开放领域问答机器人是指在任何领域都能够回答用户提问的智能机器人。与特定领域问答机器人不同&#xff0c;开放领域问答机器人需要具备更广泛的知识和更灵活的语义理解能力&#xff0c;以便能够回答各种不同类型的问题。 开发开放领域问答机器人的流程和方案可以包括以下步骤…