综合

判断文件夹是否存在

时间:2010-12-5 17:23:32  作者:知识   来源:时尚  查看:  评论:0
内容摘要: 判断文件夹是否存在 下午三点,我盯着终端里那行报错——FileNotFoundError: [Errno 2] No such file or directory: 'data/output'。脚本

判断文件夹是判断否存在

下午三点,我盯着终端里那行报错——FileNotFoundError: [Errno 2] No such file or 文件directory: 'data/output'。脚本跑了二十分钟,夹否全砸在这一个缺失的判断目录上。这不是文件第一次了。每次写文件前都赌文件夹存在,夹否赌输的判断成本是重跑整个流程。判断文件夹是文件否存在,这问题听着像给编程新手出的夹否练习题,但实际项目里,判断它往往是文件崩溃的起点。

最直接的夹否办法是os.path.isdir(path)。一行代码,判断返回布尔值,文件干净利落。夹否Python里这么写:
if not os.path.isdir('data/output'):
    os.makedirs('data/output')

注意顺序——先查,再建。别反过来。有人图省事直接os.makedirs,但它遇到已存在的目录会抛异常,除非你加上exist_ok=True参数。这参数是Python 3.2才加的,老代码里没有。所以判断一下再动手,反而少写一行try-except。

但os.path.isdir有个坑。它只认绝对路径或相对当前工作目录的路径。你脚本里写'data/output',实际取决于你启动程序时站在哪个目录。上周我同事就栽在这——他写了个定时任务,用cron跑,cron的工作目录是/,他代码里写的相对路径全找不到。后来改成基于__file__拼接绝对路径,问题才消失。判断存在性之前,先确认路径的基准点,这比判断本身更重要。

另一种场景是网络文件系统或对象存储。比如你检查S3上某个“文件夹”——其实S3没有真正的目录概念,只有key前缀。你问bucket/exists('data/output/'),它返回False,因为根本没有这个对象。实际做法是列前缀:list_objects_v2(Prefix='data/output/'),只要返回的Contents非空,就当作“存在”。这跟本地文件系统语义完全不同。我见过新手上手AWS SDK,用本地思维去判断远程目录,结果永远走else分支,疯狂创建重复资源。

性能上也别忽视。在循环里反复调用isdir,每次都是一次系统调用。一万次循环就一万次stat。能提到循环外就提。或者缓存结果——文件夹在运行期间很少会凭空消失,除非你程序自己删它。我写过一个批量处理工具,每处理一个文件就检查一次输出目录,后来改成启动时检查一次,速度提升了15%。这点优化微不足道,但白捡的。

还有一种野路子:不判断,直接尝试写入,捕获异常。Python的open()如果目标目录不存在,抛FileNotFoundError。你catch住,创建目录,再重试一次。这叫EAFP(Easier to Ask for Forgiveness than Permission),Python社区推崇的风格。比LBYL(Look Before You Leap)少一次检查,代码更紧凑。代价是异常处理逻辑稍微绕一点。看团队习惯——我偏LBYL,因为异常堆栈信息容易把真实错误掩盖掉。如果目录不存在只是众多可能异常之一,你catch了还得重新raise,反而啰嗦。

最后说个偏门但实用的:跨平台时注意Windows的盘符和UNC路径。os.path.isdir('C:\\data')没问题,但os.path.isdir('\\\\server\\share\\folder')在某些Python版本上会卡住——网络延迟导致阻塞。这种情况建议用pathlib.Path('//server/share/folder').is_dir(),它内部有超时处理,虽然文档没明说。我自己踩过这坑,跑批处理时卡了整整三分钟,最后发现是网络盘离线了。

判断文件夹是否存在,本质是问自己:我接下来要做什么?要写文件,就确保目录可写;要读文件,就检查文件本身而非目录。别把isdir当万能钥匙。有时候你真正该检查的是os.access(path, os.W_OK)——目录存在但没权限,比不存在更让人头疼。写完这段我顺手看了眼服务器日志,昨晚又有三个任务因为权限问题挂了。早该想到这层的。

最近更新
热门排行
copyright © 2026 powered by 烟消火灭网   sitemap