Python 列出目录
最后修改于 2024 年 1 月 29 日
Python 列出目录教程展示了如何在 Python 中列出目录内容。多个示例展示了如何列出目录内容并进行过滤。
目录定义
目录是计算机文件系统中用于存储和定位文件的组织单元。目录以层级方式组织成目录树。目录具有父子关系。目录有时也称为文件夹。
多年来,Python 获得了多种列出目录内容的 API。例如,我们可以使用 Path.iterdir
、os.scandir
、os.walk
、Path.rglob
或 os.listdir
函数。
Python Path.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 ...
Python Path.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
来仅显示文件的一部分。
Python Path.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
来检查条目是否为文件。
Python Path.iterdir 简洁示例
下面的示例展示了一个非常简洁的代码示例。
#!/usr/bin/python from pathlib import Path home_path = Path.home() print(*Path(home_path).iterdir(), sep="\n")
iterdir
返回一个生成器。使用 *
运算符,我们将其解包为 print
函数的参数。
Python 使用 Path.glob 列出目录
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 ...
Python 使用 os.scandir 列出目录
os.scandir
在 Python 3.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)
该示例列出了当前工作目录中的所有文件。
Python 使用 os.walk 递归列出目录
os.walk
递归遍历给定目录;它产生一个 3 元组 (dirpath, dirnames, filenames)。
#!/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
函数。
Python 使用 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 Path 树
以下实际程序以层级树结构输出指定目录的内容。
#!/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)
该示例从 Downloads 目录生成一个目录树。
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)}')
该示例打印 Downloads 目录中所有大于 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
列出内容。
Python 使用 os.listdir 列出目录
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
函数。
Python fnmatch 与 os.listdir
fnmatch
模块支持类 Unix shell 的通配符。它们不同于正则表达式。shell 风格通配符中使用的特殊字符是
模式 | 含义 |
---|---|
* | 匹配所有 |
? | 匹配任何单个字符 |
[seq] | 匹配 seq 中的字符 |
[!seq] | 匹配不在 seq 中的字符 |
fnmatch
特殊字符fnmatch
函数将文件名和模式作为参数。
#!/usr/bin/python import fnmatch import os path = '.' for file in os.listdir(path): if fnmatch.fnmatch(file, '*.csv'): print(file)
在示例中,我们列出了所有 CSV 文件。
$ ./list_csv.py temperatures.csv data_2019.csv data.csv
目录中有三个 CSV 文件。
使用 Pandas 在表格中显示 Python 目录内容
Pandas 是一个 Python 数据分析和操作工具。下面的示例在 Pandas DataFrame 中显示目录列表。
#!/usr/bin/python import pandas as pd from pathlib import Path import time path = Path.cwd() all_files = [] for e in path.rglob('*.*'): all_files.append((e.name, e.parent, time.ctime(e.stat().st_ctime))) columns = ['File_Name', 'Parent', 'Created'] df = pd.DataFrame.from_records(all_files, columns=columns) print(df.head(5))
在示例中,我们展示了前几个文件条目的文件名、它们的后缀和创建日期,并将其放入 Pandas DataFrame 中。
$./list_pandas.py File name Suffix Created 0 recursive_glob.py .py Fri Sep 11 13:04:54 2020 1 list_dir_files2.py .py Fri Sep 11 12:50:22 2020 2 multiple_extensions.py .py Fri Sep 11 16:09:30 2020 3 walking3.py .py Fri Sep 11 13:06:31 2020 4 list_files.py .py Fri Sep 11 14:23:47 2020
使用 PrettyTable 在表格中显示 Python 目录内容
PrettyTable 是一个用于生成简单 ASCII 表的 Python 库。
#!/usr/bin/python from prettytable import PrettyTable from pathlib import Path import time pt = PrettyTable() path = Path.cwd() all_files = [] pt.field_names = ['File name', 'Suffix', 'Created'] for e in path.rglob('*.*'): pt.add_row((e.name, e.suffix, time.ctime(e.stat().st_ctime))) print(pt)
我们使用 PrettyTable 生成的表格显示当前目录的文件名、它们的后缀和创建日期。
$ ./list_pretty_table.py +------------------------+--------+--------------------------+ | File name | Suffix | Created | +------------------------+--------+--------------------------+ | recursive_glob.py | .py | Fri Sep 11 13:04:54 2020 | | list_dir_files2.py | .py | Fri Sep 11 12:50:22 2020 | | multiple_extensions.py | .py | Fri Sep 11 16:09:30 2020 | | walking3.py | .py | Fri Sep 11 13:06:31 2020 | | list_files.py | .py | Fri Sep 11 14:23:47 2020 | | temperatures.csv | .csv | Fri Sep 11 12:50:37 2020 | | list_pandas.py | .py | Sat Sep 12 08:11:57 2020 | | list_files_modified.py | .py | Fri Sep 11 14:59:32 2020 | | recursive_scandir.py | .py | Fri Sep 11 16:42:36 2020 | | list_dir_files.py | .py | Fri Sep 11 12:48:49 2020 | | data_2019.csv | .csv | Fri Sep 11 12:47:35 2020 | | listing2.py | .py | Fri Sep 11 15:18:03 2020 | | listing.py | .py | Fri Sep 11 15:12:55 2020 | | system_list.py | .py | Fri Sep 11 12:53:13 2020 | | listing3.py | .py | Fri Sep 11 13:24:58 2020 | | scan_dir.py | .py | Fri Sep 11 16:00:53 2020 | | list_dir.py | .py | Fri Sep 11 12:46:34 2020 | | list_files_size.py | .py | Fri Sep 11 16:52:20 2020 | | walking.py | .py | Fri Sep 11 16:41:27 2020 | | walking2.py | .py | Fri Sep 11 12:46:34 2020 | | list_dir_generator.py | .py | Sat Sep 12 07:54:17 2020 | | scan_dir2.py | .py | Fri Sep 11 16:00:23 2020 | | data.csv | .csv | Fri Sep 11 12:47:35 2020 | | list_files2.py | .py | Fri Sep 11 17:07:18 2020 | | globbing.py | .py | Fri Sep 11 15:26:45 2020 | | rglobbing.py | .py | Fri Sep 11 15:26:24 2020 | | data.txt | .txt | Fri Sep 11 12:47:35 2020 | | path_tree.py | .py | Fri Sep 11 13:26:39 2020 | | list_csv.py | .py | Sat Sep 12 07:48:16 2020 | | links.txt | .txt | Fri Sep 11 16:58:25 2020 | | succint.py | .py | Fri Sep 11 15:49:54 2020 | | list_pretty_table.py | .py | Sat Sep 12 08:13:37 2020 | +------------------------+--------+--------------------------+
来源
在本文中,我们展示了如何在 Python 中列出目录内容。
作者
列出所有 Python 教程。