您现在的位置是:综合 >>正文

判断文件夹是否存在

综合213人已围观

简介 判断文件夹是否存在 下午三点,我盯着终端里那行报错——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)——目录存在但没权限,比不存在更让人头疼。写完这段我顺手看了眼服务器日志,昨晚又有三个任务因为权限问题挂了。早该想到这层的。

Tags:

相关文章

  • 能看限制级的网站

    综合

    我上个月在某个深夜,点开了一个朋友发来的链接。域名长得像一串乱码,后缀是.io。页面加载得很快,没有弹窗,没有诱导注册,直接就是视频列表。我点开一个标注着“未删减”的条目,画面清晰得让我下意识看了眼浏 ...

    【综合】

    阅读更多
  • 宁波网站

    综合

    宁波的网站,十有八九是给外贸公司做的。你随便点开一家做五金件的厂子官网,首页准是滚动的车间照片,英文版比中文版做得还精细,询盘按钮恨不得焊在你鼠标上。这城市靠港口吃饭,网站也就跟着长成了码头的形状—— ...

    【综合】

    阅读更多
  • 派出所通知去采集信息

    综合

    电话是下午三点打来的。我正对着电脑改方案,屏幕右下角突然弹出一条陌生号码的来电。接起来,对方自称是辖区派出所的民警,语气平静得像是通知我去取个快递:“您好,麻烦您近期带身份证来一趟,做个信息采集。对, ...

    【综合】

    阅读更多


友情链接