如何判断pathlib.Path是文件还是目录路径(无需物理存在)
如何不访问磁盘区分pathlib.Path对应的是文件还是目录路径
要在不检查磁盘实际存在性的前提下区分pathlib.Path对象是文件还是目录路径,只能基于路径字符串的格式约定来推断——因为路径本身只是一个标识字符串,没有内置的类型属性(真实类型由磁盘上的实体决定)。
你之前方法的问题
你用filepath.suffix判断的逻辑存在明显缺陷:
- 无后缀的文件(比如
README)会被误判为目录 - 虽然带斜杠的目录能被正确识别,但无法覆盖所有场景
改进后的实现
下面的实现结合两种常见路径约定做推断:
- 路径末尾以目录分隔符(
/或\,跨平台兼容)结尾 → 视为目录 - 路径带有文件后缀(比如
.txt、.tar.gz)→ 视为文件 - 无后缀且不以分隔符结尾的路径 → 无法确定(返回
unknown,可根据需求调整默认值)
from pathlib import Path import os def function_to_differentiate_file_and_dir(filepath: Path) -> str: # 判断路径是否以目录分隔符结尾(通常表示目录) if str(filepath).endswith(os.sep): return 'dir' # 判断路径是否有文件后缀(通常表示文件) if filepath.suffix: return 'file' # 无后缀且无结尾分隔符的情况,无法仅凭路径确定类型 return 'unknown'
测试示例
home = Path.home() # 带后缀的文件路径 assert function_to_differentiate_file_and_dir(home / 'test.txt') == 'file' # 带结尾分隔符的目录路径 assert function_to_differentiate_file_and_dir(home / 'test_dir/') == 'dir' # 无后缀的路径(不确定类型) assert function_to_differentiate_file_and_dir(home / 'README') == 'unknown'
注意事项
这种推断是基于通用约定,并非100%准确:
- 存在带后缀的目录(比如特殊场景下的
static.html目录) - 存在无后缀的文件(比如系统配置文件
hosts)
但这是不访问磁盘的前提下,能做到的最合理判断逻辑。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

