资源操作之文件和路径(上)
1. 路径表示法
1) 相对路径
获取文件相对路径
一般写法: 使用Python3的标准库,pathlib模块Path类的构造函数
from pathlib import Path
# 相对于当前目录的相对路径
p1 = Path()
print(p1) # 结果为:.
# 相对于当前目录相对路径a/b/c/d
p2 = Path('a', 'b', 'c/d')
print(p2) # 结果为:a\b\c\d
2) 绝对路径
获取文件绝对路径表示
推荐写法: 使用Python3的标准库,pathlib模块Path类的absolute()方法
from pathlib import Path
# 用户当前的工作目录为:
D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\express
# 当前目录的Path路径
p1 = Path()
print(p1.absolute()) # 结果为:D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\express
# 当前文件的绝对路径
p1 = Path(__file__)
print(p1.absolute()) # 结果为:D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\express\absolute_path.py
# 当前目录下的a/b/c/d目录
p2 = Path('a', 'b', 'c/d')
print(p2.absolute()) # 结果为:D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\express\a\b\c\d
# 带有盘符的路径即生成绝对路径
p3 = Path('D:', 'a', 'b', 'test.txt')
print(p3) # 结果为:D:a\b\test.txt
p3 == p3.absolute() # 结果为:True
推荐写法: 使用Python3的标准库,os.path模块的abspath()方法
from pathlib import Path
import os
# 用户当前的工作目录为:
D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\express
# 当前目录的绝对路径
# 写法一:
p1 = os.path.abspath('.')
print(p1) # 结果为:D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\express
# 写法二:
p1 = os.path.abspath('')
print(p1) # 结果为:D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\express
# 当前文件的绝对路径
p1 = os.path.abspath(__file__)
print(p1) # 结果为:D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\express\absolute_path.py
# 当前目录下的a/b/c/d目录的绝对路径
# 写法一:
path = 'a/b/c/d'
p2 = os.path.abspath(path)
print(p2) # 结果为:D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\express\a\b\c\d
# 写法二:
# 构造'a/c/c/d'的Path
path = Path('a', 'b', 'c/d')
p2 = os.path.abspath(path)
print(p2) # 结果为:D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\express\a\b\c\d
# 带有盘符的路径即生成绝对路径
# 写法一:
path = 'C:/a/b/test.txt'
p3 = os.path.abspath(path)
print(p3) # 结果为:C:a\b\test.txt
# 写法二:
# 构造'C:a\b\test.txt'的Path
path = Path('C:', 'a', 'b', 'test.txt')
p3 = os.path.abspath(path)
print(p3) # 结果为:C:a\b\test.txt
2. 路径获取
1) 获取用户工作目录
获取用户工作目录
推荐写法: 使用Python3的标准库,os模块getcwd()函数
import os
os.getcwd() # 结果为:'D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\obtain'
一般写法: 使用Python3的标准库,os模块os.path.abspath()函数
import os
# 写法一:
os.path.abspath('.') # 结果为:'D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\obtain'
# 写法二:
os.path.abspath(os.curdir) # 结果为:'D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\obtain'
# 写法三:
os.path.abspath('') # 结果为:'D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\obtain'
一般写法: 使用Python3的标准库,pathlib模块Path类的cwd()或absolute()方法
from pathlib import Path
# 参数为空表示当前目录
p = Path()
# 写法一:
print(p.cwd()) # 结果为:'D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\obtain'
# 写法二:
print(p.absolute()) # 结果为:'D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\obtain'
2) 拼接文件路径
基于基础的路径进行路径的拼接操作
一般写法: 使用’/'运算符
- 不管是 UNIX 风格的路径,还是 Windows风格的路径,都是使用斜杠作为连接运算符的
from pathlib import Path
p1 = Path('D:', 'a/b')
print(p1) # 结果为:D:a\b
# Path对象和字符串拼接
p2 = p1 / 'c/d' / 'test.txt'
print(p2) # 结果为:D:a\b\c\d\test.txt
# Path对象和Path对象拼接
p3 = Path('c', 'd', 'test.txt')
p4 = p1 / p3
print(p4) # 结果为:D:a\b\c\d\test.txt
一般写法: 使用Python3的标准库,pathlib模块Path类的joinpath()方法
from pathlib import Path
p1 = Path('D:', 'a/b')
# Path对象和字符串拼接
p2 = p1.joinpath('c/d', 'e', 'test.txt')
print(p2) # 结果为:D:a\b\c\d\e\test.txt
p3 = Path('c/d', 'e', 'test.txt')
# Path对象和Path对象拼接
p4 = p1.joinpath(p3)
print(p4) # 结果为:D:a\b\c\d\e\test.txt
3) 构造Path路径
Path用于来表示文件或者目录的路径
一般写法: 使用Python3的标准库,pathlib模块Path类的构造方法
from pathlib import Path
# 表示当前目录的Path路径
p1 = Path()
print(p1.cwd()) # 结果为:D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\obtain
# 当前目录下的a/b/c/d
p2 = Path('a', 'b', 'c/d')
# 相对路径
print(p2) # 结果为:a\b\c\d
# 绝对路径
print(p2.absolute()) # 结果为:D:\ProjectCode\python_guide\PythonCodingGuide\doc\resource\path\obtain\a\b\c\d
# 带有盘符的路径即生成绝对路径
p3 = Path('D:', 'a', 'b', 'test.txt')
# 绝对路径
print(p3) # 结果为:D:a\b\test.txt
# 绝对路径
print(p3.absolute()) # 结果为:D:a\b\test.txt
3. 路径解析
1) 逻辑父目录
获取目录的逻辑父目录
一般写法: 使用Python3的标准库,pathlib模块Path类的parent属性
from pathlib import Path
p = Path('/a/b/c')
parent = p.parent
print(parent) # 结果为:\a\b
2) 父目录序列
获取给定目录的父目录序列
一般写法: 使用Python3的标准库,pathlib模块Path类的parents属性
- 索引为0的值为直接父目录
from pathlib import Path
p = Path('D:', '/a/b/c')
print(p) # 结果为:D:\a\b\c
parents = p.parents
for p in parents:
print(p)
# 输出结果为:
'''
D:\a\b
D:\a
D:\
'''
3) 目录最后一部分
获取目录路径的最后一部分
一般写法: 使用Python3的标准库,pathlib模块Path类的name属性
from pathlib import Path
p = Path('D:', '/a/b/c')
print(p) # 结果为:D:\a\b\c
name = p.name
print(name) # 结果为:c
p = Path('D:', '/a/b/test.txt')
print(p) # 结果为:D:\a\b\test.txt
name = p.name
print(name) # 结果为:test.txt
4) 目录最后一部分的扩展名
获取目录路径的最后一部分文件名的扩展名
一般写法: 使用Python3的标准库,pathlib模块Path类的suffix属性
- 若文件有多个扩展名,则取最末尾的扩展名
from pathlib import Path
p = Path('D:', '/a/b/test.txt')
print(p) # 结果为:D:\a\b\test.txt
suffix = p.suffix
print(suffix) # 结果为:.txt
5) 目录最后一部分去除后缀
获取目录路径的最后一部分并且除去文件名的后缀
一般写法: 使用Python3的标准库,pathlib模块Path类的stem属性
from pathlib import Path
p = Path('D:', '/a/b/c')
print(p) # 结果为:D:\a\b\c
stem = p.stem
print(stem) # 结果为:c
p = Path('D:', '/a/b/test.txt')
print(p) # 结果为:D:\a\b\test.txt
stem = p.stem
print(stem) # 结果为:test
6) 目录最后一部分的扩展名列表
获取给定目录路径的最后一部分的扩展名列表
一般写法: 使用Python3的标准库,pathlib模块Path类的suffix属性
from pathlib import Path
p = Path('D:', '/a/b/c.e.f')
suffixs = p.suffixs
print(suffixs) # 结果为:['.e', '.f']
p = Path('D:', '/text.tar.gz')
suffixs = p.suffixs
print(suffixs) # 结果为:['.tar', '.gz']
7) 将path分割成目录和文件名
推荐写法: 使用Python3的标准库,os模块的函数:os.path.split(path),path指代一个路径
- 需要导入os模块
- 将path拆分成目录和文件名,返回一个(head, tail)二元组
- head为目录,若path中没有斜线(’’,’/’),则head为空字符串
- tail为文件名,tail中永远不会有斜线,若path以斜线(’’,’/’)结尾,则tail为空字符串
- 若path为空字符串,则head和tail均为空
- 使用函数os.path.join(path, *paths)可还原path(字符串可能不尽相同)
import os
path1 = "path\\parse\\path_split.py"
(head1, tail1) = os.path.split(path1)
print((head1, tail1)) # ('path\\parse', 'path_split.py')
path_join = os.path.join(head1, tail1) # 使用函数os.path.join(path, *paths)拼接,还原path
print(path_join) # "path\parse\path_split.py"
path2 = "path/parse"
(head2, tail2) = os.path.split(path2)
print((head2, tail2)) # ('path', 'parse')
# path以斜线结尾
path3 = "path/parse/"
(head3, tail3) = os.path.split(path3)
print((head3, tail3)) # ('path/parse', '')
# path中没有斜线
path4 = "parse_split.py"
(head4, tail4) = os.path.split(path4)
print((head4, tail4)) # ('', 'parse_split.py')
# path为空
path5 = ""
(head5, tail5) = os.path.split(path5)
print((head5, tail5) ) # ('', '')
8) 将path分割成路径和文件扩展名
推荐写法: 使用Python3的标准库,os模块的函数:os.path.splitext(path),path指代一个路径
- 需要导入os模块
- 将path拆分成路径和文件扩展名,返回一个(root, ext)二元组,使root + ext == path
- root为路径;ext为’.扩展名’,最多包含一个句点’.’,若path中没有扩展名,则ext为空字符串
- 若path为空字符串,则root和ext均为空
import os
path1 = "path\\parse\\path_split.py"
(root1, ext1) = os.path.splitext(path1)
print((root1, ext1)) # ('path\\parse\\path_split', '.py')
print(root1 + ext1 == path1) # 还原path True
# path中多个"."
path2 = "parse_splitext..py"
(root2, ext2) = os.path.splitext(path2)
print((root2, ext2)) # ('parse_splitext.', '.py')
# path中没有.扩展名
path3 = "path/parse"
(root3, ext3) = os.path.splitext(path3)
print((root3, ext3)) # ('path/parse', '')
# path为空
path4 = ""
(root4, ext4) = os.path.splitext(path4)
print((root4, ext4)) # ('', '')
9) 提取文件名
推荐写法: 使用Python3的标准库,os模块的函数:os.path.basename(path),path指代一个路径
- 需要导入os模块
- 从path中提取文件名,返回一个字符串,若path为空字符串,则返回为空
- 返回值实际上是使用函数os.path.split(path)拆分path得到的tail
import os
path1 = "path\\parse\\path_basename.py"
name1 = os.path.basename(path1)
print(name1) # path_basename.py
path2 = "path/parse"
name2 = os.path.split(path2)
print(name2) # ('path', 'parse')
# path以斜线结尾
path3 = "path/parse/"
name3 = os.path.basename(path3)
print(name3) # ""
# path中没有斜线
path4 = "parse_basename.py"
name4 = os.path.basename(path4)
print(name4) # parse_basename.py
# path为空
path5 = ""
name5 = os.path.basename(path5)
print(name5) # ""
资源操作之文件和路径(下)
4. 路径判断
1) 判断是否为目录
推荐写法: 使用Python3的标准库,os模块的os.path.isdir()函数
- 需要导入os模块
import os
path = Path('/CODE/pythonCodeGuide/PythonCodingGuide')
if os.path.isdir(path): # 返回True
'''路径是一个目录'''
path = Path('pythonCodeGuide/PythonCodingGuide')
# 路径不存在时,返回False
if os.path.isdir(path):
'''路径不存在'''
path = Path('/CODE/pythonCodeGuide/PythonCodingGuide/main.py')
# 路径不是目录时,返回False
if os.path.isdir(path):
'''路径不是一个目录'''
推荐写法: 使用Python3的标准库,内置函数is_dir()
path = Path('/CODE/pythonCodeGuide/PythonCodingGuide')
if path.is_dir(): # 返回True
'''路径是一个目录'''
path = Path('pythonCodeGuide/PythonCodingGuide')
# 路径不存在时,返回False
if path.is_dir():
'''路径不存在'''
path = Path('/CODE/pythonCodeGuide/PythonCodingGuide/main.py')
# 路径不是目录时,返回False
if path.is_dir():
'''路径不是一个目录'''
2) 判断是否为文件
推荐写法: 使用Python3的标准库,os模块的os.path.isfile()函数
- 需要导入os模块
import os
path = Path('/CODE/pythonCodeGuide/PythonCodingGuide/main.py')
if os.path.isfile(path): # 返回True
'''路径是一个文件'''
path = Path('pythonCodeGuide/PythonCodingGuide')
# 路径不存在时,返回False
if os.path.isfile(path):
'''路径不存在'''
path = Path('/CODE/pythonCodeGuide/PythonCodingGuide')
# 路径不是文件时,返回False
if os.path.isfile(path):
'''路径不是一个文件'''
推荐写法: 使用Python3的标准库,内置函数is_file()
path = Path('/CODE/pythonCodeGuide/PythonCodingGuide/main.py')
if path.is_file(): # 返回True
'''路径是一个文件'''
path = Path('pythonCodeGuide/test')
# 路径不存在时,返回False
if path.is_file():
'''路径不存在'''
path = Path('/CODE/pythonCodeGuide/PythonCodingGuide')
# 路径不是文件时,返回False
if path.is_file():
'''路径不是一个文件'''
3) 判断path是否存在
推荐写法: 使用Python3的标准库,os模块的os.path.exists()函数
- 需要导入os模块
import os
path = Path('/CODE/pythonCodeGuide/PythonCodingGuide')
# 路径存在,返回True
if os.path.exists(path):
'''路径存在'''
path = Path('/pythonCodeGuide/PythonCodingGuide')
# 路径不存在,返回False
if os.path.exists(path):
'''路径不存在'''
推荐写法: 使用Python3的标准库,内置函数exists()
path = Path('/CODE/pythonCodeGuide/PythonCodingGuide')
# 路径存在,返回True
if path.exists():
'''路径存在'''
path = Path('/pythonCodeGuide/PythonCodingGuide')
# 路径不存在,返回False
if path.exists():
'''路径不存在'''
4) 判断是否为绝对路径
推荐写法: 使用Python3的标准库,os模块的os.path.isabs()函数
- 需要导入os模块
- 即使目标路径是不存在的,只要命名对象是绝对路径,就返回True
import os
path = Path("D:/pythonCodeGuide/test")
# 当是绝对路径时,返回True
if os.path.isabs(path):
'''是绝对路径'''
path = Path("/pythonCodeGuide/test")
# 当不是绝对路径时,返回False
if os.path.isabs(path):
'''不是绝对路径'''
推荐写法: 使用Python3的标准库,内置函数is_absolute()
- 即使目标路径是不存在的,只要命名对象是绝对路径,就返回True
path = Path("D:/pythonCodeGuide/test")
# 当是绝对路径时,返回True
if path.is_absolute():
'''是绝对路径'''
path = Path("/pythonCodeGuide/test")
# 当不是绝对路径时,返回False
if path.is_absolute():
'''不是绝对路径'''
5) 判断是否为符号链接
推荐写法: 使用Python3的标准库,os模块的os.path.islink()
- 如果文件不存在,os.path.islink()返回False
import os
# iamfile-s -> /CODE/pythonCodeGuide/PythonCodingGuide/doc/resource/iamfile
path = Path("/CODE/pythonCodeGuide/PythonCodingGuide/iamfile-s")
# 当对象是一个符号链接时,返回True
if os.path.islink(path):
'''是一个符号链接'''
path = Path("/CODE/pythonCodeGuide/PythonCodingGuide/doc/resource/iamfile")
# 当对象不是一个符号链接时,返回False
if os.path.islink(path):
'''不是一个符号链接'''
推荐写法: 使用Python3的标准库,内置函数is_symlink()
- 如果文件不存在,os.path.islink()返回False
# iamfile-s -> /CODE/pythonCodeGuide/PythonCodingGuide/doc/resource/iamfile
path = Path("/CODE/pythonCodeGuide/PythonCodingGuide/iamfile-s")
# 当对象是一个符号链接时,返回True
if path.is_symlink():
'''是一个符号链接'''
path = Path("/CODE/pythonCodeGuide/PythonCodingGuide/doc/resource/iamfile")
# 当对象不是一个符号链接时,返回False
if path.is_symlink():
'''不是一个符号链接'''
6) 判断是否为目录的符号链接
推荐写法: 使用Python3的标准库,判断是否为目录的符号链接
def is_dir_symlink(location):
"""第一步:转换为path
第二步:path为符号链接文件
第三步:判断符号链接的目标文件是否是目录"""
path = Path(location)
if not path.exists():
return False
return path.is_symlink() & path.is_dir()
# 或者引入os模块 return os_path_islink() & os.path.isdir()
# iamdir-s -> /CODE/pythonCodeGuide/PythonCodingGuide/doc/resource/iamdir
# 对象为符号链接,且为目录的符号链接
is_dir_symlink("/CODE/pythonCodeGuide/PythonCodingGuide/iamdir-s") # 结果:True
# 对象不是符号链接
is_dir_symlink("/CODE/pythonCodeGuide/PythonCodingGuide/iamdir-h") # 结果:False
# 对象不存在
is_dir_symlink("/CODE/pythonCodeGuide/PythonCodingGuide/iamdir_not_exist") # 结果:False
7) 判断是否为文件的符号链接
推荐写法: 使用Python3的标准库,判断是否为文件的符号链接
def is_file_symlink(location):
"""第一步:转换为path
第二步:path为符号链接文件
第三步:判断符号链接的目标文件是否是文件"""
path = Path(location)
if not path.exists():
return False
return path.is_symlink() & path.is_file()
# 或者引入os模块 return os_path_islink() & os.path.isfile()
# iamfile-s -> /CODE/pythonCodeGuide/PythonCodingGuide/doc/resource/iamfile
# 对象为符号链接,且为文件的符号链接
is_file_symlink("/CODE/pythonCodeGuide/PythonCodingGuide/iamfile-s") # 结果:True
# 对象为普通文件
is_file_symlink("/CODE/pythonCodeGuide/PythonCodingGuide/iamfile-h") # 结果:False
# 对象文件不存在
is_file_symlink("/CODE/pythonCodeGuide/PythonCodingGuide/iamfile_not_exist") # 结果:False
5. 目录创建
1) 创建单个目录
推荐写法: 使用Python3的标准库,os模块的函数:os.mkdir(path[, mode=0o777])
- 需要导入os模块
- 用于在已存在的目录中创建一个文件夹,path指代一个文件夹名或路径,mode为权限模式(因平台而异)
- 若path是文件夹名,则默认在当前目录下创建
- 若path包含路径,则必须给出一个已存在的父路径,否则会抛出FileNotFoundError
- 若路径中包含转义字符,可使用双斜线“\”或“r”前缀,消除转义字符
- 若目标文件夹已存在,会抛出FileExistsError
import os
os.mkdir("dir1") # 在当前目录下创建dir
# 抛出FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'dir1'
os.mkdir("dir1")
# 抛出FileNotFoundError: [WinError 3] 系统找不到指定的路径。: '\\test\\dir1'
os.mkdir("\\test\\dir1")
# 在parent_path下创建dir2
os.mkdir(r"parent_path\dir2")
2) 创建多级目录
推荐写法: 使用Python3的标准库,os模块的函数:os.makedirs(name [, mode=0o777, exist_ok=False])
- 需要导入os模块
- 用于递归创建一个或多个文件夹,name指代一个文件夹名或路径,mode为权限模式
- 若name是文件夹名,则默认在当前目录下创建
- 若name包含路径,则会递归创建所有给出的不存在的文件夹
- 若目标文件夹已存在:exists_ok=False(默认),抛出FileExistsError;exists_ok=True,不会抛出异常
import os
os.makedirs("dir1") # 在当前目录下创建dir
# 抛出FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'dir1'
os.makedirs("dir1")
os.makedirs("dir1", exist_ok=True) # 设置exist_ok=True,当目标文件夹已存在,不会抛出异常
os.makedirs("test\\dir2") # 在当前目录下创建test,在test下创建dir2
os.makedirs(r"parent_path\dir3") # 创建"parent_path\\dir3"路径上所有不存在的文件夹
6. 目录操作
1) 目录遍历
推荐写法: 使用Python3的标准库,os模块的函数:os.walk(top[, topdown=True, οnerrοr=None,followlinks=False])
- 需要导入os模块
- 递归遍历指定路径,返回一个(dirpath, dirnames, filenames)三元组
- dirpath是一个字符串,表示目录的路径;dirnames是一个列表,包含了dirpath下所有的一级目录的名字(不包含子目录);filenames是一个列表,包含了dirpath下所有的文件的名字(不包含子目录),使用函数os.path.join(dirpath, name)可得到文件的全路径
- top指定要遍历的目录的路径,其它三个是可选参数,topdown指定递归遍历的顺序,onerror指定异常时的回调函数
- 若topdown=True(默认),则自顶向下深度遍历目录树,先遍历父目录,再遍历子目录
- 若topdown=False,则自底向上遍历目录树,先遍历子目录,再遍历父目录
import os
# 自顶向下遍历目录树
for dirpath, dirnames, filenames in os.walk("parent_path\\path"):
print(dirpath) # 返回一个string,表示目录的路径
print(dirnames) # 返回一个list,包含了dirpath下所有的一级目录名
print(filenames) # 返回一个list,包含了dirpath下所有的文件名
for name in filenames:
print(os.path.join(dirpath, name)) # 获取top目录下所有文件的全路径(包括子目录)
2) 列举目录下所有文件(不包含子文件夹)
获取文件夹下的所有文件(不包含子文件夹)
推荐写法: 使用Python3的标准库,os模块的os.listdir()函数
- 需要导入os模块
- os.listdir()函数会列出目标目录下所有文件以及子目录名称
- 使用os.path.isfile()函数筛选出其中的文件
import os
file_list = [f for f in os.listdir("/pythonTest/work") if os.path.isfile(os.path.join("/pythonTest/work", f))]
# 也可以写成如下形式
for filename in os.listdir("/pythonTest/work"):
if os.path.isfile(filename):
print(filename)
推荐写法: 使用Python3的标准库,os模块的os.walk()函数
- 需要导入os模块
- 递归遍历指定路径,返回一个(dirpath, dirnames, filenames)三元组,如果只需要顶层目录下的文件,只需要在第一次迭代后break即可
import os
file_list = []
for (dirpath, dirnames, filenames) in os.walk("/pythonTest/work"):
file_list.extend(filenames)
break
3) 列举目录下所有文件(包含子文件夹)
获取文件夹下的所有文件(包含子文件夹)
推荐写法: 使用Python3的标准库,os模块的os.walk()函数
- 需要导入os模块
- 递归遍历指定路径,返回一个(dirpath, dirnames, filenames)三元组,如果只需要文件名,取出filenames即可
import os
file_list = []
for (dirpath, dirnames, filenames) in os.walk("/pythonTest/work"):
file_list.extend(filenames)
一般写法: 使用Python3的标准库,os模块的os.listdir()函数
- 需要导入os模块
import os
def print_files(path):
"""第一步:os.listdir()函数列出目标目录下所有的文件和子目录;
第二步:dirs返回当前目录下的所有目录,递归dirs直到最深一层;
第三步:打印所有文件名"""
lsdir = os.listdir(path)
dirs = [i for i in lsdir if os.path.isdir(os.path.join(path, i))]
if dirs:
for i in dirs:
print_files(os.path.join(path, i))
files = [i for i in lsdir if os.path.isfile(os.path.join(path, i))]
for f in files:
print(f)
print_files("/pythonTest/work")
4) 列举当前目录下符合条件的文件
获取当前目录下符合条件的文件名
推荐写法: 使用Python3的标准库,glob模块的glob.glob()函数
- 需要导入glob模块
- 返回目录下符合条件的文件名的列表
- 不包含子目录下的文件
import glob
# 获取顶层目录下所有python文件名
glob.glob("/pythonTest/work/*.py")
推荐写法: 使用Python3的标准库,os模块的os.walk()函数
- 需要导入os模块
- 获取所有文件后筛选出符合条件的文件
- 若需要包含子目录下的文件,去掉break即可
import os
# 筛选出顶层目录下的python文件
file_list = []
for (dirpath, dirnames, filenames) in os.walk("/pythonTest/work"):
for item in filenames:
if ".py" in item:
file_list.append(item)
break
print(file_list)
5) 列举目录下所有子目录
获取文件夹下的所有子目录
推荐写法: 使用Python3的标准库,os模块的os.listdir()函数
- 需要导入os模块
- os.listdir()函数会列出目标目录下所有文件以及子目录名称
- 使用os.path.isdir()函数筛选出其中的目录
import os
"""只包含顶层目录下的子目录"""
dir_list = [f for f in os.listdir("/pythonTest/work") if os.path.isdir(os.path.join("/pythonTest/work", f))]
# 也可以写成如下形式
for filename in os.listdir("/pythonTest/work"):
if os.path.isdir(filename):
print(filename)
"""获取目录下的所有子目录名称"""
def print_files(path):
lsdir = os.listdir(path)
dirs = [i for i in lsdir if os.path.isdir(os.path.join(path, i))]
if dirs:
for i in dirs:
print_files(os.path.join(path, i))
sub_dirs = [i for i in lsdir if os.path.isdir(os.path.join(path, i))]
for f in sub_dirs:
print(f)
print_files("/pythonTest/work")
推荐写法: 使用Python3的标准库,os模块的os.walk()函数
- 需要导入os模块
- 递归遍历指定路径,返回一个(dirpath, dirnames,filenames)三元组,如果只需要顶层目录下的目录,只需要在第一次迭代后break即可
import os
"""只包含顶层目录下的子目录"""
dir_list = []
for (dirpath, dirnames, filenames) in os.walk("/pythonTest/work"):
dir_list.extend(dirnames)
break
"""获取目录下的所有子目录名称"""
dir_list = []
for (dirpath, dirnames, filenames) in os.walk("/pythonTest/work"):
dir_list.extend(dirnames)