开放的编程资料库

当前位置:我爱分享网 > Python教程 > 正文

Python 列表目录

Python列表目录教程展示了如何在Python中列出目录内容。多个示例展示了如何列出目录内容并对其进行过滤。

目录定义

目录是计算机文件系统中用于存储和定位文件的组织单元。目录按层次结构组织成目录树。目录具有父子关系。目录有时也称为文件夹。

多年来,Python获得了多种列出目录内容的API。例如,我们可以使用Path.iterdiros.scandiros.walkPath.rglobos.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))

在这个例子中,我们列出了当前工作目录中的所有文件。我们使用内置的filteros.path.isfile函数。

Pythonfnmatch与os.listdir

fnmatch模块支持Unixshell风格的通配符。它们与正则表达式不同。shell样式通配符中使用的特殊字符是:

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数据分析和操作工具。以下示例显示了PandasDataFrame中的目录列表。

#!/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))

在示例中,我们显示了PandasDataFrame中第一个文件条目的文件名、后缀和创建日期。

$./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教程。

未经允许不得转载:我爱分享网 » Python 列表目录

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏
模式 含义
* 匹配所有内容
? 匹配任何单个字符
[seq] 匹配seq中的字符
[!seq] 匹配不在seq中的字符