os.path.isdir()和os.path.isfile()在脚本中都返回False,但返回True(就像应该那样)

时间:2019-05-04 07:32:52

标签: python for-loop

我正在尝试使用foros模块遍历文件名列表,将itemtype变量相应地更改为“ FILE”或“ DIRECTORY”,并且打印出来。当我尝试在Python控制台中执行此操作时,效果很好。但是,当几乎相同的代码段在我的脚本中运行时,isdir()isfile()函数均返回false。

我可以在控制台中尝试:

>>> import os
>>> files = os.listdir()
>>> print(files)
['namebydate.py', 'order.bat', 'storebydate.py', 'test', '__pycache__']
>>> for i in files:
...  itemtype=''
...  if os.path.isdir(i):
...   itemtype='DIRECTORY'
...  elif os.path.isfile(i):
...   itemtype='FILE'
...
...  print('{itemtype}'.format(itemtype=itemtype))
...
FILE
FILE
FILE
DIRECTORY
DIRECTORY
>>>

它工作得很好。 但是当我的脚本运行并达到其等效状态时:

for i in files:
    itemtype = ''
    if os.path.isdir(i):
        itemtype = 'DIRECTORY'
    elif os.path.isfile(i):
        itemtype = 'FILE'
    print('({current}/{total}) [{itemtype}] {name}'.format(
        current=str(files.index(i)+1),
        total=len(files),
        itemtype=itemtype,
        name=i))

函数返回false,将itemtype值保留为空字符串,并且输出变为:

Listing...
(1/4) [] testdir
(2/4) [] testdoc1.txt
(3/4) [] testdoc2.txt
(4/4) [] testdoc3.txt

在这种情况下,预期结果应该为:

Listing...
(1/4) [DIRECTORY] testdir
(2/4) [FILE] testdoc1.txt
(3/4) [FILE] testdoc2.txt
(4/4) [FILE] testdoc3.txt

1 个答案:

答案 0 :(得分:1)

isdirisfile要求path,而listdir返回name。换句话说,要使用isdirisfile进行检查,应在文件名之前附加路径。例如:

import os

dir = '/'
files = os.listdir(dir)
os.path.isdir(os.path.join(dir, files[0])
os.path.isfile(os.path.join(dir, files[0])