【python基础】—文件与文件夹的处理(os模块和pathlib模块)


前言

本文主要使用os模块和pathlib模块进行文件与文件夹的处理。直接使用os.listdir(path)返回当前path下的全部文件和目录的列表,但是实际运用情况下,我们常常可能只需要当前path的文件或者目录信息。


一、文件

目录情况:

.//test

├── test_1/
│ └── logRegres.ipynb

├── hello.txt
├── movie.txt
├── new_hello.txt
└── new_world.txt

import os
os.listdir(".\\test")

在这里插入图片描述

os.listdir(path)只返回一级目录下的文件与子目录,子目录下的文件没有出现。

返回当前目录下所有文件而非文件夹的名称列表

1.不包括子目录下的文件

方法一:使用os模块
  • 示例1:输出文件名称
import os
def get_filelists(file_dir):	
    list_directory = os.listdir(file_dir)
    filelists = []
    for directory in list_directory:
        if (os.path.isfile(os.path.join(file_dir,directory))):
            filelists.append(directory)
    return filelists

get_filelists(".\\test\\")

返回结果:

在这里插入图片描述

用os.listdir(path),path为目录路径,返回该路径下所有文件和子目录,循环os.path对象列表,用os.path.isfile()判断是否为文件,如果是,则返回该文件名。

  • 示例2:输出"路径+文件名称"
import os
def get_filelists(file_dir):	
    list_directory = os.listdir(file_dir)
    filelists = []
    for directory in list_directory:
        if (os.path.isfile(os.path.join(file_dir,directory))):
            filelists.append(os.path.join(file_dir,directory))
    return filelists

get_filelists(".\\test\\")

返回结果:

在这里插入图片描述

用os.listdir(path),path为目录路径,返回该路径下所有文件和子目录,循环os.path对象列表,用os.path.isfile()判断是否为文件,如果是,os.path.join(路径,文件名)返回"路径+文件名称"。

方法二:使用pathlib模块(Path.iterdir()、字Path.glob(“*”))
  • 示例1:输出文件名称
import pathlib

def get_filelists(file_dir):
    directory = pathlib.Path(file_dir)
    filelists=[]
    for i in directory.iterdir() :
        if (i.is_file()):
            filelists.append(i.name)
    return filelists

get_filelists(".\\test\\")

使用Path.iterdir()返回的是每个文件及目录对应的路径信息,循环pathlib.Path.iterdir()对象,用Path.is_file()判断其是否为文件,如果是,则调用.name属性只返回文件名称。

import pathlib

def get_filelists(file_dir):
    directory = pathlib.Path(file_dir)
    filelists=[]
    for i in directory.glob("*"):
        if (i.is_file()):
            filelists.append(i.name)
    return filelists
    
get_filelists(".//test")

使用Path.glob(“*”)返回的是每个文件及目录对应的路径信息,循环pathlib.Path.glob(“*”)对象,用Path.is_file()判断其是否为文件,如果是,则调用.name属性只返回文件名称。

返回结果如下:
在这里插入图片描述

  • 示例2:输出"路径+文件名称"
import pathlib

def get_filelists(file_dir):
    directory = pathlib.Path(file_dir)
    filelists=[]
    for i in directory.iterdir() :
        if (i.is_file()):
            filelists.append(i)
    return filelists

get_filelists(".\\test\\")

返回结果:

在这里插入图片描述

使用Path.iterdir()返回的是每个文件及目录对应的路径信息,循环pathlib.Path.iterdir()对象,用Path.is_file()判断其是否为文件,直接返回返回"路径+文件名称"。

2.包括子目录下的文件

方法一:使用os模块(os.walk())
  • 示例1:输出文件名称 / 输出"路径+文件名称"
import os

file_paths = []
filename_lists = []
def get_filelists(file_dir):
	for root, dirs, files in os.walk(file_dir):
	    for file in files:
	        filename_lists.append(file)
	        file_paths.append(os.path.join(root, file))
	return filename_lists,file_paths

filename_lists,file_paths = get_filelists(".\\test")

print(filename_lists) # 输出纯文件名

在这里插入图片描述

print(file_paths) # 输出"路径+文件名称"

在这里插入图片描述

使用os.walk()遍历目录的路径,返回值是一个可遍历的三元元组对象,包括了遍历目录的路径、该目录下子目录的路径及该目录下的文件名称。如果想要返回该目录下文件名称,则取遍历三元元组对象的第三个元素;如果想要返回带路径的文件名称,则取遍历三元元组对象的第一和每三个元素,用os.path.join()连接。


注意: os.walk()的用法

os.walk(top, topdown=True, οnerrοr=None, followlinks=False)

参数说明:

top:指定遍历目录的地址
topdown:默认为真,含义是优先遍历指定的目录地址,否则优先遍历目录下的子目录
onerror:指定一个 callable 对象,这个是当发生异常的时候,会调用
followlinke:默认为假,含义是不遍历目录下的快捷方式

返回:os.walk()的返回值是一个可遍历的对象,每次遍历返回的是一个三元元组,可用root,dirs,files接收

root:遍历到某目录的地址
dirs:list 对象,存储遍历到该目录下的子目录名称
files:list 格式,存储遍历到该目录下的文件


方法二:使用pathlib模块(Path.glob(“**/*.*”)、Path.rglob(*))
  • 示例1:输出文件名称
import pathlib

def get_filelists(file_dir):
    filelists=[]
    directory = pathlib.Path(file_dir)
    for i in directory.glob("**/*.*") :
        print(i)
        if (i.is_file()):
            filelists.append(i.name)
    return filelists
    
get_filelists(".//test")

使用Path.glob(“**/*.*”)返回的是路径下每个文件(包括子目录下的文件)信息,循环pathlib.Path.glob(“**/.”)对象,用Path.is_file()判断其是否为文件,如果是,则调用.name属性只返回文件名称。

import pathlib

def get_filelists(file_dir):
	filelists=[]
	directory = pathlib.Path(file_dir)
	for i in directory.rglob("*") :
	    if (i.is_file()):
	        filelists.append(i.name)
	return filelists

get_filelists(".//test")	

使用Path.rglob(“*”)返回的是路径下每个文件(包括子目录下的文件)及目录对应的路径 (包括子目录下的目录) 信息,循环pathlib.Path.rglob(“*”)对象,用Path.is_file()判断其是否为文件,如果是,则调用.name属性只返回文件名称。

返回结果 :
在这里插入图片描述

  • 示例2:输出"路径+文件名称"
import pathlib

def get_filelists(file_dir):
    filelists=[]
    directory = pathlib.Path(file_dir)
    for i in directory.glob("**/*.*") :
        if (i.is_file()):
            filelists.append(i)
    return filelists

get_filelists(".//test")

使用Path.glob(“**/.”)返回的是路径下每个文件(包括子目录下的文件)信息,循环pathlib.Path.glob(“**/.”)对象,用Path.is_file()判断其是否为文件,如果是,直接返回返回"路径+文件名称"。

import pathlib

def get_filelists(file_dir):
	filelists=[]
	directory = pathlib.Path(file_dir)
	for i in directory.rglob("*") :
	    if (i.is_file()):
	        filelists.append(i)
	return filelists

get_filelists(".//test")	

在这里插入图片描述

使用Path.rglob(“*”)返回的是路径下每个文件(包括子目录下的文件)及目录对应的路径(包括子目录下的目录)信息,循环pathlib.Path.rglob(“*”)对象,用Path.is_file()判断其是否为文件,如果是,直接返回返回"路径+文件名称"。


注意:对于pathlib.Path对象的glob()方法与rglob()方法的使用

Ⅰ 不考虑嵌套文件夹中的文件,使用glob()方法;
Ⅱ 考虑嵌套文件夹中的文件,使用rglob()方法;

如果不仅仅想要获取所有子文件的路径,还想要指定路径下"符合条件"文件的路径信息,比如想取.ipynb后缀文件,代码如下 :

使用glob()方法

import pathlib

def get_filelists(file_dir):
	filelists=[]
	directory = pathlib.Path(file_dir)
	for i in directory.glob("*/*.ipynb") :
	    if (i.is_file()):
	        filelists.append(i)
	return filelists

get_filelists(".//test")

使用rglob()方法

import pathlib

def get_filelists(file_dir):
	filelists=[]
	directory = pathlib.Path(file_dir)
	for i in directory.rglob("*.ipynb") :
	    if (i.is_file()):
	        filelists.append(i)
	return filelists

get_filelists(".//test")	

返回结果一致如下,注意观察两者的参数区别。

在这里插入图片描述


二、文件夹

目录情况:

.//test

├── test_1/
│ └── test_2/
│ └── logRegres.ipynb

├── hello.txt
├── movie.txt
├── new_hello.txt
└── new_world.txt

返回当前目录下的文件夹

1.不包括子目录下的文件夹

方法一:使用os模块
  • 示例1:输出目录名称
import os

def get_dirlists(file_dir):	
    list_directory = os.listdir(file_dir)
    dirlists = []
    for directory in list_directory:
        if (os.path.isdir(os.path.join(file_dir,directory))):
            dirlists.append(directory)
    return dirlists 

get_dirlists(".\\test\\")

返回结果:
在这里插入图片描述

用os.listdir(path),path为目录路径,返回该路径下所有文件和子目录,循环os.path对象列表,用os.path.isdir()判断是否为目录,如果是则返回该目录名称。

  • 示例2:输出"路径+目录名称"
import os

def get_filedirs(file_dir):	
    list_directory = os.listdir(file_dir)
    dirlists = []
    for directory in list_directory:
        if (os.path.isdir(os.path.join(file_dir,directory))):
            dirlists.append(os.path.join(file_dir,directory))
    return dirlists 

get_filedirs(".\\test\\")

返回结果:
在这里插入图片描述

用os.listdir(path),path为目录路径,返回该路径下所有文件和子目录,循环os.path对象列表,用os.path.isdir()判断是否为目录名称,如果是,os.path.join(路径,目录名称)返回"路径+目录名称"。

方法二:使用pathlib模块(Path.iterdir()、字Path.glob(“*”))
  • 示例1:输出目录名称
import pathlib

def get_dirlists(file_dir):	
    directory = pathlib.Path(".//test")
    dirlists=[]
    for i in directory.iterdir() :
        if (i.is_dir()):
            dirlists.append(i.name)
    return dirlists

get_dirlists(".\\test\\")

使用Path.iterdir()返回的是每个文件及目录对应的路径信息,循环pathlib.Path.iterdir()对象,用Path.is_dir()判断其是否为目录,如果是,则调用.name属性只返回目录名称。

import pathlib

def get_dirlists(file_dir):	
	directory = pathlib.Path(".//test")
	dirlists=[]
	for i in directory.glob("*") :
	    if (i.is_dir()):
	        dirlists.append(i.name)
    return dirlists

get_dirlists(".\\test\\")

使用Path.glob(“*”)返回的是每个文件及目录对应的路径信息,循环pathlib.Path.glob(“*”)对象,用Path.is_dir()判断其是否为目录,如果是,则调用.name属性只返回目录名称。

返回结果:
在这里插入图片描述

  • 示例2:输出"路径+目录名称"

使用Path.iterdir()带有对应的路径

import pathlib

def get_dirlists(file_dir):	
    directory = pathlib.Path(".//test")
    dirlists=[]
    for i in directory.iterdir() :
        if (i.is_dir()):
            dirlists.append(i)
    return dirlists

get_dirlists(".\\test\\")

返回结果:
在这里插入图片描述

使用Path.iterdir()返回的是每个文件及目录对应的路径信息,循环pathlib.Path.iterdir()对象,用Path.is_file()判断其是否为目录,直接返回返回"路径+目录名称"。

2.包括子目录下的文件夹

方法一:使用os模块(os.walk())
  • 示例1:输出纯目录名称 \ 输出"路径+目录名称"
import os

def get_dirlists(file_dir):
    dir_lists = []
    dir_paths = []
    for root, dirs, files in os.walk(file_dir):        
        for dir in dirs: 
            dir_lists.append(dir)
            dir_paths.append(os.path.join(root,dir))  
    return dir_lists,dir_paths

dir_lists,dir_paths = get_dirlists(".\\test")

print(dir_lists) # 输出纯目录名称

返回结果:
在这里插入图片描述

print(dir_paths) # 输出"路径+目录名称"

返回结果:
在这里插入图片描述

使用os.walk()遍历目录的路径,返回值是一个可遍历的三元元组对象,包括了遍历目录的路径、该目录下子目录的路径及该目录下的文件名称。如果想要返回该目录下目录名称,则取遍历三元元组对象的第二元素;如果想要返回带路径的目录名称,则取遍历三元元组对象的第一和每二个元素,用os.path.join()连接。

方法二:使用pathlib模块(Path.glob(“*/**”)、Path.rglob(*))
  • 示例1:输出纯目录名称
import pathlib

def get_dirlists(file_dir):
	directory = pathlib.Path(file_dir)
	dir_paths = []
	for i in directory.glob("*/**") :
	    if (i.is_dir()):
	        dir_paths .append(i.name)
	return dir_paths

get_dirlists(".//test")

使用Path.globglob(“*/**”)返回的是路径下目录对应的路径(包括子目录下的目录)信息,循环pathlib.Path.globglob(“*/**”)对象,用Path.is_dir()判断其是否为目录,如果是,则调用.name属性只返回目录名称。

import pathlib

def get_dirlists(file_dir):
	directory = pathlib.Path(file_dir)
	dir_paths = []
	for i in directory.rglob("*") :
	    if (i.is_dir()):
	        dir_paths .append(i.name)
	return dir_paths

get_dirlists(".//test")

返回结果:
在这里插入图片描述

使用Path.rglob(“*”)返回的是路径下每个文件(包括子目录下的文件)及目录对应的路径(包括子目录下的目录)信息,循环pathlib.Path.rglob(“*”)对象,用Path.is_dir()判断其是否为目录,如果是,则调用.name属性只返回目录名称。

  • 示例2:输出"路径+目录名称"
import pathlib

def get_dirlists(file_dir):
    dir_paths =[]
    directory = pathlib.Path(file_dir)
    for i in directory.glob("**/**") :
        if (i.is_dir()):
            dir_paths.append(i)
    return dir_paths 

get_dirlists(".//test")

返回结果:
在这里插入图片描述

使用Path.glob(“**/**”)返回的是路径下每个文件(包括子目录下的文件)及目录对应的路径信息,循环pathlib.Path.glob(“**/**”)对象,用Path.is_file()判断其是否为目录,如果是,直接返回返回"路径+目录名称"。

import pathlib

def get_dirlists(file_dir):
	directory = pathlib.Path(file_dir)
	dir_paths = []
	for i in directory.rglob("*") :
	    if (i.is_dir()):
	        dir_paths .append(i)
	return dir_paths

get_dirlists(".//test")

返回结果:

在这里插入图片描述

使用Path.rglob(““)返回的是路径下每个文件(包括子目录下的文件)及目录对应的路径(包括子目录下的目录)信息,循环pathlib.Path.rglob(””)对象,用Path.is_file()判断其是否为目录,如果是,直接返回返回"路径+目录名称"。


参考文章:
https://mp.weixin.qq.com/s/upXCeqRAsR-dZdr_UPwLvA
https://blog.csdn.net/weixin_45445406/article/details/126394021

  • 29
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值