前言
本文主要使用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