os.listdir('.')

本文详细介绍了如何获取目录中文件名称的方法,涵盖了不同数据类型如str和bytes的处理方式,以及特殊情况如使用None或文件描述符作为路径参数。文章还强调了返回文件名列表的顺序和特殊条目的处理规则。
返回包含目录中文件名称的列表。
    
     path可以指定为str或bytes。 如果path是bytes,
       返回的文件名也将是字节; 在所有其他情况下
       返回的文件名将是str。
     如果path为None,则使用path ='.'。
     在某些平台上,路径也可以指定为打开的文件描述符; \
       文件描述符必须引用目录。
       如果此功能不可用,则使用它会引发NotImplementedError。
    
     该列表按任意顺序排列。 它不包括特殊
     条目'。' 和'..'即使它们存在于目录中。

Return a list containing the names of the files in the directory.

path can be specified as either str or bytes.  If path is bytes,
  the filenames returned will also be bytes; in all other circumstances
  the filenames returned will be str.
If path is None, uses the path='.'.
On some platforms, path may also be specified as an open file descriptor;\
  the file descriptor must refer to a directory.
  If this functionality is unavailable, using it raises NotImplementedError.

The list is in arbitrary order.  It does not include the special
entries '.' and '..' even if they are present in the directory.
"""
<think>我们正在讨论Python中glob和os.listdir的使用方法及区别。根据引用内容,我们可以总结如下: 1. **os.listdir(path)**: - 功能:列出指定目录下的所有文件和子目录的名称(不包括路径),返回一个字符串列表。 - 不支持通配符过滤。 - 需要配合`os.path`模块来判断文件类型或拼接路径。 2. **glob.glob(pathname, *, recursive=False)**: - 功能:根据指定的模式匹配文件路径,返回一个包含匹配路径的列表。 - 支持通配符(如`*`、`?`、`[]`)来匹配文件名。 - 可以设置`recursive=True`来递归搜索子目录。 3. **主要区别**: - `os.listdir`只返回文件名(不带路径),而`glob.glob`返回完整的路径(取决于模式中是否包含路径)。 - `glob.glob`支持通配符,可以一次性过滤出特定类型的文件,而`os.listdir`需要额外处理过滤。 - 性能方面,对于简单的目录列表,`os.listdir`可能更快,但`glob`在需要模式匹配时更便捷。 4. **其他相关函数**: - `os.scandir`: 在Python 3.5+中推荐使用,它返回一个迭代器,每个条目是`DirEntry`对象,可以直接获取文件属性(如是否是文件、目录等),效率比`os.listdir`更高。 - `os.walk`: 用于递归遍历目录,返回每个子目录的路径、子目录列表和文件列表。 下面我们通过代码示例详细说明: ### 示例1: 使用`os.listdir` ```python import os # 获取当前目录下的所有文件和子目录名称 names = os.listdir('.') # 返回如:['file1.txt', 'subdir', 'script.py'] print(names) # 配合过滤:只获取文件 files = [name for name in os.listdir('.') if os.path.isfile(os.path.join('.', name))] print(files) ``` ### 示例2: 使用`glob.glob` ```python import glob # 获取当前目录下所有.txt文件(返回完整路径) txt_files = glob.glob('./*.txt') # 返回如:['./file1.txt', './notes.txt'] print(txt_files) # 递归获取所有子目录中的.txt文件 all_txt_files = glob.glob('./**/*.txt', recursive=True) print(all_txt_files) ``` ### 示例3: 使用`os.scandir`(更高效的方式) ```python import os # 获取当前目录下的条目,并直接判断属性 with os.scandir('.') as entries: for entry in entries: if entry.is_file(): print(f"File: {entry.name}") elif entry.is_dir(): print(f"Directory: {entry.name}") ``` ### 示例4: 使用`os.walk`递归遍历 ```python import os for root, dirs, files in os.walk('/path/to/directory'): for file in files: if file.endswith('.txt'): full_path = os.path.join(root, file) print(full_path) ``` ### 总结对比表 | 方法 | 返回内容 | 通配符支持 | 递归支持 | 效率/额外信息 | |--------------------|----------------------------------|-----------|-------------------|--------------| | `os.listdir(path)` | 目录下所有文件和子目录的名称(无路径) | 不支持 | 不支持 | 较低,需配合其他函数 | | `glob.glob(pattern)` | 匹配模式的文件路径列表 | 支持 | 通过`recursive=True` | 中等,模式匹配方便 | | `os.scandir(path)` | `DirEntry`对象的迭代器 | 不支持 | 不支持 | 高,可直接获取文件属性 | | `os.walk(path)` | 递归遍历生成(根目录, 子目录列表, 文件列表) | 不支持 | 是 | 中等,适合递归操作 | ### 选择建议 - 需要简单列出目录内容且无需过滤:`os.listdir` 或 `os.scandir`(推荐后者,效率更高)。 - 需要按模式过滤文件:直接使用`glob.glob`。 - 需要递归遍历整个目录结构:`os.walk`或`glob.glob`(当设置`recursive=True`时)。 - 需要文件属性信息(如类型、大小等):优先使用`os.scandir`。 §§相关问题§§ 1. 在递归搜索文件时,`glob.glob`和`os.walk`哪个更高效? 2. 如何获取文件的绝对路径而不是相对路径? 3. `glob`模块中的`iglob`函数有什么作用? </think>### Python 中 `glob` 和 `os.listdir` 的使用方法及区别 以下基于引用内容整理,结合代码示例说明核心差异: #### 1. **`os.listdir()` 使用方法** - **功能**:列出目录下的所有文件和子目录名称(**不包含完整路径**)。 - **语法**:`os.listdir(path=".")` - `path`:目录路径(默认当前目录) - **特点**: - 返回文件名列表(如 `["file.txt", "subdir"]`) - **不支持通配符**(如 `*.txt`) - 需配合 `os.path` 判断文件类型或拼接路径 - **示例**: ```python import os # 列出当前目录所有内容 files = os.listdir() print(files) # 输出: ["main.py", "data", "image.jpg"] # 筛选 ".txt" 文件(需手动处理) txt_files = [f for f in os.listdir() if f.endswith(".txt")] ``` --- #### 2. **`glob.glob()` 使用方法** - **功能**:通过通配符模式匹配文件路径(**返回完整路径**)。 - **语法**:`glob.glob(pathname, *, recursive=False)` - `pathname`:支持通配符的模式(如 `*.py`) - `recursive=True`:递归搜索子目录 - **特点**: - 支持通配符 `*`(任意字符)、`?`(单字符)、`[0-9]`(范围匹配) - 直接返回匹配的**完整路径**(如 `["/data/file.txt"]`) - 可递归搜索(`**/*.txt` + `recursive=True`) - **示例**: ```python import glob # 搜索当前目录所有 .txt 文件 txt_files = glob.glob("*.txt") print(txt_files) # 输出: ["file1.txt", "notes.txt"] # 递归搜索子目录中的 .png 文件 png_files = glob.glob("**/*.png", recursive=True) ``` --- ### ✨ 核心区别总结 | **特性** | **`os.listdir()`** | **`glob.glob()`** | |------------------------|-----------------------------------|----------------------------------| | **返回内容** | 仅文件名(无路径) | 完整文件路径 | | **通配符支持** | ❌ 不支持 | ✅ 支持 (`*`, `?`, `[]`) | | **路径拼接需求** | 需手动 `os.path.join()` | 自动返回完整路径 | | **递归搜索** | 需配合 `os.walk()` 实现 | 直接支持 (`recursive=True`) | | **文件过滤便利性** | 需手动遍历+条件判断 | 一行代码通配符匹配 | --- ### ✅ 使用场景建议 1. **`os.listdir()` 适用**: - 仅需获取目录下的名称列表 - 需自定义复杂过滤逻辑(如同时判断文件类型、修改时间) - 结合 `os.scandir()`(Python≥3.5)高效获取文件属性[^3]: ```python with os.scandir("/data") as entries: for entry in entries: if entry.is_file(): print(entry.name, entry.stat().st_size) ``` 2. **`glob.glob()` 适用**: - 按模式快速筛选文件(如所有图片、日志文件) - 需要递归搜索子目录内容 - 避免手动拼接路径 > 💡 **本质关系**(引用[2]): > `glob.glob()` ≈ `os.listdir()` + `os.path.join()` + 通配符过滤
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值