【Python】判断是否是文件夹永远返回False的问题

笔者用python写脚本时使用os.path.isdir判断文件夹时,发现无论是什么文件类型,一律返回False。

笔者做了一个测试,重现了这个问题:

在~/Documents/Test下,有这两个文件:
目录结构
一个用于测试的测试文件夹,一个是python测试脚本。其中,测试文件夹中有这些文件:
测试文件夹内容
现在,在test.py脚本中,列出"测试文件夹"中所有 文件夹

脚本内容如下:

import os
curDir=os.getcwd()
print("当前工作目录:"+curDir)
testDir="测试文件夹"
print("=====start=====")
for f in os.listdir(testDir):
    if(os.path.isdir(f)):
        print("文件夹:"+f)
print("=====end=====")

运行结果如下:

当前工作目录:/Users/devnn/Documents/TEST
=====start=====
=====end=====

奇怪的是,竟然没有列出文件夹。

有网友说os.path.isdir(file)需要传入文件的绝对路径。于是笔者使用os.path.abspath获取绝对路径。代码如下:

import os
curDir=os.getcwd()
print("当前工作目录:"+curDir)
testDir="测试文件夹"
print("=====start=====")
for f in os.listdir(testDir):
    absFile=os.path.abspath(f)
    if(os.path.isdir(absFile)):
        print("文件夹:"+f)
print("=====end=====")

运行结果跟之前一样,仍然没有列出文件夹!

又有网友说,由于文件路径包含中文,无法识别,需要使用unicode()函数转码。但是笔者发现python3中unicode()无法识别,根本没有这个函数。那么python3中如何解决中文路径问题呢?

网上找了很多也没有找到答案。但是看到有说python3中是默认使用utf-8编码,即默认支持中文。那么问题又在哪里呢?

折腾了好久,最后有了新的发现。

下面加上一行代码,将absFile变量打印出来:

import os
curDir=os.getcwd()
print("当前工作目录:"+curDir)
testDir="测试文件夹"
print("=====start=====")
for f in os.listdir(testDir):
    absFile=os.path.abspath(f)
    print("absFile:"+absFile)
    if(os.path.isdir(absFile)):
        print("文件夹:"+f)
print("=====end=====")

运行结果如下:

当前工作目录:/Users/devnn/Documents/TEST
=====start=====
absFile:/Users/devnn/Documents/TEST/file2.txt
absFile:/Users/devnn/Documents/TEST/file3.txt
absFile:/Users/devnn/Documents/TEST/文件夹2
absFile:/Users/devnn/Documents/TEST/file1.txt
absFile:/Users/devnn/Documents/TEST/文件夹3
absFile:/Users/devnn/Documents/TEST/.DS_Store
absFile:/Users/devnn/Documents/TEST/文件夹1
=====end=====

终于发现了问题所在,打印的路径中竟然没有 “测试文件夹”

看来os.path.abspath(file)函数竟然不靠谱?!不会吧,这可是python自带的函数呀。

那也只好认了啊,根据我们的理解,这个函数不是获取真正的绝对路径,而是 “当前工作路径/文件名称”

哎,那么我们就自己拼接绝对路径吧。修改后的代码:

import os
curDir=os.getcwd()
print("当前工作目录:"+curDir)
testDir="测试文件夹"
print("=====start=====")
for f in os.listdir(testDir):
    absTestDir=os.path.abspath(testDir)
    absFile=os.path.join(absTestDir,f)
    if(os.path.isdir(absFile)):
        print("文件夹:"+f)
print("=====end=====")

运行结果如下:

当前工作目录:/Users/devnn/Documents/TEST
=====start=====
文件夹:文件夹2
文件夹:文件夹3
文件夹:文件夹1
=====end=====

这回终于列出了所有的文件夹。看来以后我们使用os.path.abspath需要小心哦。

结论:os.path.abspath(file)获取的不是真正的绝对路径,而是“当前工作路径/文件名称”。

原创文章 56 获赞 44 访问量 9万+

猜你喜欢

转载自blog.csdn.net/devnn/article/details/93190815
今日推荐