【问题标题】:os.path.isfile() return true only if the file is in directoryos.path.isfile() 仅当文件在目录中时才返回 true
【发布时间】:2020-08-20 07:11:38
【问题描述】:

我尝试使用os 来分隔文件夹和文件,但os.path.isfile()os.path.isdir() 仅在文件(或文件夹)与程序位于同一文件夹中时才返回True

我的代码:

if(os.path.exists(".")):  # check if the folder exist    
    for x in os.listdir("."):                       
        if os.path.isfile(  os.path.abspath(x)): print('f',  x)
        elif os.path.isdir( os.path.abspath(x)): print('d',  x)
        elif os.path.islink(os.path.abspath(x)): print('l',  x)
        else:                                    print('n/a', x)

控制台:

d left
f main.py
d right

我在“左”文件夹中查看的代码:

if(os.path.exists(".\\left")):  # check if the folder exist           
    for x in os.listdir(".\\left"):                      
        if os.path.isfile(  os.path.abspath(x)): print('f',  x)
        elif os.path.isdir( os.path.abspath(x)): print('d',  x)
        elif os.path.islink(os.path.abspath(x)): print('l',  x)
        else:                                    print('n/a', x)

控制台:

n/a normalFile.txt
n/a normalFolder

我真的不明白为什么os.path.isfile()os.path.isdir() 返回False

【问题讨论】:

  • 因为您没有告诉os 函数您的文件位于当前目录以外的任何位置。使用os.path.join(folder, x) 而不仅仅是x
  • 变量x 只包含文件名。您正在检查文件是否存在于当前目录中。您必须使用 os.path.join 加入路径。

标签: python


【解决方案1】:

os.listdir() 只返回文件名。您需要将它们与目录名称一起加入以获取完整路径。

if(os.path.exists(".\\left")):  # check if the folder exist           
    for x in os.listdir(".\\left"):
        fullpath = os.path.join( ".\\left", x)                  
        if os.path.isfile(  fullpath): print('f',  x)
        elif os.path.isdir( fullpath): print('d',  x)
        elif os.path.islink(fullpath): print('l',  x)
        else:                          print('n/a', x)

os.path.abspath() 自己无法做到这一点,因为它不知道 x 来自哪个目录。

【讨论】:

  • 附带说明一下,使用".\\" 可能会导致跨平台问题(并且简单地使用"left" 应该可以正常工作)。
  • @Selcuk 原始字符串或正斜杠通常是简单的解决方案。
【解决方案2】:

在处理路径时,习惯使用pathlib 会好得多。看看它是多么简单:

from pathlib import Path

path = Path(".\\left")
if path.exists():  # check if the folder exist           
    for x in path.iterdir():                      
        if x.is_file():      print('f',  x)
        elif x.is_dir():     print('d',  x)
        elif x.is_symlink(): print('l',  x)
        else:                print('n/a', x)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多