Python列表目录教程展示了如何在Python中列出目录内容。多个示例展示了如何列出目录内容并对其进行过滤。
目录定义
目录是计算机文件系统中用于存储和定位文件的组织单元。目录按层次结构组织成目录树。目录具有父子关系。目录有时也称为文件夹。
多年来,Python获得了多种列出目录内容的API。例如,我们可以使用Path.iterdir、os.scandir、os.walk、Path.rglob或os.listdir函数。
Python路径.iterdir
Path.iterdir生成目录内容的路径对象。子项以任意顺序生成,特殊条目’.’和’..’不包括在内。
#!/usr/bin/python
from pathlib import Path
path = '.'
for path in Path(path).iterdir():
print(path)
该示例列出了当前目录的内容。该列表是非递归的,包括文件和目录。
$ ./listing.py recursive_glob.py list_dir_files2.py multiple_extensions.py walking3.py list_files.py temperatures.csv list_pandas.py src ...
这是一个示例输出。
PythonPath.iterdir列出目录
以下示例显示了如何仅列出目录。
#!/usr/bin/python
from pathlib import Path
path = Path('.')
dirs = [e for e in path.iterdir() if e.is_dir()]
for dir in dirs:
print(dir)
#print(dir.parts[-1])
该示例显示了当前目录的所有直接子目录。
dirs = [e for e in path.iterdir() if e.is_dir()]
我们使用Python列表理解构建目录列表。is_dir为目录条目返回True。
for dir in dirs:
print(dir)
#print(dir.parts[-1])
在for循环中,我们打印找到的所有目录。我们可以显示整个路径或使用parts仅显示文件的一部分。
PythonPath.iterdir列表文件
以下示例显示如何仅列出文件。
#!/usr/bin/python
from pathlib import Path
path = Path('/home/janbodnar/Documents/prog/python/')
files = [e for e in path.iterdir() if e.is_file()]
for file in files:
print(file)
该示例列出了给定目录中的所有文件。我们使用is_file来检查条目是否为文件。
PythonPath.iterdir简洁示例
以下示例显示了一个非常简洁的代码示例。
#!/usr/bin/python from pathlib import Path home_path = Path.home() print(*Path(home_path).iterdir(), sep="\n")
iterdir返回一个生成器。使用*运算符,我们将其解压缩为print函数的参数。
带有Path.glob的Python列表目录
Path.glob生成所有匹配给定简单模式的文件。**模式递归地表示此目录和所有子目录。例如,**/*.py查找该目录及其所有子目录中的所有Python文件。
#!/usr/bin/python
from pathlib import Path
path = Path('.')
for e in path.glob('*.py'):
print(e)
该示例打印当前目录中所有以.py扩展名结尾的文件。
$ ./globbing.py recursive_glob.py list_dir_files2.py multiple_extensions.py walking3.py list_files.py list_pandas.py list_files_modified.py recursive_scandir.py list_dir_files.py ...
这是一个示例输出。
Python使用Path.rglob递归列出目录
Path.rglob是对Path.glob的方便调用,在给定的相对模式前添加了**/。
#!/usr/bin/python
from pathlib import Path
path = Path('/home/janbodnar/Documents/prog/python/')
for e in path.rglob('*.py'):
print(e)
# for e in path.glob('**/*.py'):
# print(e)
该示例查找给定目录及其所有子目录中的所有Python文件。注释代码做同样的工作。
具有多个扩展名的Python列表目录
以下示例列出了具有三个可能扩展名的所有文件。
#!/usr/bin/python
from pathlib import Path
path = Path.cwd()
files = { p.resolve() for p in Path(path).glob("**/*")
if p.suffix in ['.py', '.csv', '.txt'] }
for file in files:
print(file.parts[-1])
该示例列出了所有.py、.csv和.txt文件。
files = { p.resolve() for p in Path(path).glob("**/*")
if p.suffix in ['.py', '.csv', '.txt'] }
我们使用集合理解来构建一组具有提供的扩展名的文件。
$ ./multiple_extensions.py data_2019.csv walking.py list_files.py data.txt multiple_extensions.py scan_dir.py list_files_size.py list_pandas.py temperatures.csv recursive_glob.py list_dir_files2.py data.csv ...
这是一个示例输出。
带有os.scandir的Python列表目录
os.scandir是在Python3.5中引入的,目的是提高性能并减轻旧版os.listdir的一些限制。
scandir函数返回目录条目以及文件属性信息,为许多常见用例提供更好的性能。
#!/usr/bin/python
import os
path = '.'
with os.scandir(path) as it:
for entry in it:
if entry.is_file():
print(entry.name)
该示例列出了当前工作目录中的所有文件。
使用os.walk递归地列出目录
os.walk递归地遍历给定的目录;它产生一个3元组(目录路径、目录名称、文件名)。
#!/usr/bin/python
import os
path = '/home/janbodnar/Documents/prog/python/'
for dirpath, dirs, files in os.walk(path):
for file in files:
file_name = os.path.join(dirpath, file)
if file_name.endswith('.py'):
print(file_name)
该示例列出了所有Python文件。要检查文件是否为Python文件,我们使用endswith函数。
使用os.scandir递归地列出目录
os.walk返回一个os.DirEntry对象的迭代器,对应于路径给定的目录中的条目。
#!/usr/bin/python
import os
def scan_recursive(path):
with os.scandir(path) as it:
for entry in it:
if entry.is_file():
yield entry.name
else:
yield from scan_recursive(entry.path)
for e in scan_recursive('/root/Documents/prog/python/'):
print(e)
该示例使用scandir函数以及生成器和递归模式以递归方式查找给定目录中的所有文件。
Python路径树
以下实用程序以分层树结构输出指定目录的内容。
#!/usr/bin/python
from pathlib import Path
def generate_tree(directory):
print(f'+ {directory}')
for path in sorted(directory.rglob('*')):
depth = len(path.relative_to(directory).parts)
spacer = ' ' * depth
# print(f'{spacer}+ {path.name}')
if path.is_file():
print(f'{spacer}f {path.name}')
else:
print(f'{spacer}d {path.name}')
path = Path.home() / 'Downloads'
generate_tree(path)
该示例从下载目录生成目录树。
Python按大小列出目录文件
以下示例列出了按大小过滤的文件。
#!/usr/bin/python
import os
from pathlib import Path
path = Path.home() / 'Downloads'
size = 1024*1024*1024
large_files = [e for e in path.rglob('*.*') if e.is_file() and os.path.getsize(e) >= size]
for file in large_files:
print(f'{file} {os.path.getsize(file)}')
该示例打印下载目录中所有大于1GB的文件。我们使用path.rglob递归遍历并使用os.path.getsize确定文件大小。
Python按修改日期列出目录
以下示例按修改日期列出所有文件。
#!/usr/bin/python
import os
import datetime
now = datetime.datetime.now()
ago = now - datetime.timedelta(minutes=30)
path = '/home/janbodnar/Documents/prog/python/'
for root, dirs, files in os.walk(path):
for fname in files:
path = os.path.join(root, fname)
st = os.stat(path)
mtime = datetime.datetime.fromtimestamp(st.st_mtime)
if mtime > ago:
print(f'{path} modified {mtime}')
在示例中,我们列出了最近30分钟内修改过的所有文件。我们使用os.stat函数获取文件的修改日期和os.walk列出内容。
使用os.listdir的Python列表目录
os.listdir返回一个列表,其中包含路径给定目录中条目的名称。该列表按任意顺序排列,不包括特殊条目“.”和“..”。
这是较旧的API,通常建议使用较新的API来列出目录。
#!/usr/bin/python
import os
path = '.'
files = os.listdir(path)
for file in files:
print(file)
该示例列出了当前目录中的所有文件和目录。
#!/usr/bin/python import os dirs = filter(os.path.isfile, os.listdir()) print(tuple(dirs))
在这个例子中,我们列出了当前工作目录中的所有文件。我们使用内置的filter和os.path.isfile函数。
Pythonfnmatch与os.listdir
fnmatch模块支持Unixshell风格的通配符。它们与正则表达式不同。shell样式通配符中使用的特殊字符是:
| 模式 | 含义 |
|---|---|
| * | 匹配所有内容 |
| ? | 匹配任何单个字符 |
| [seq] | 匹配seq中的字符 |
| [!seq] | 匹配不在seq中的字符 |
