os.path.isfile()不起作用。为什么?

时间:2015-08-22 14:19:32

标签: python

我正在尝试这样做:

import os
[x for x in os.listdir('.') if os.path.isfile(x)]
[x for x in os.listdir('dirname') if os.path.isfile(x)]
[x for x in os.listdir(os.path.abspath('dirname')) if os.path.isfile(os.path.abspath(x))] 

第一行有效:

[x for x in os.listdir('.') if os.path.isfile(x)]

但接下来的两个:

[x for x in os.listdir('dirname') if os.path.isfile(x)]

[x for x in os.listdir(os.path.abspath('dirname')) if os.path.isfile(os.path.abspath(x))] 

只输出[]

为什么?

2 个答案:

答案 0 :(得分:4)

由于您需要将dirname加入xos.listdir()只是直接列出内容,因此内容没有完整路径。

示例 -

[x for x in os.listdir('dirname') if os.path.isfile(os.path.join('dirname',x))]

如果未提供完整路径,os.path.isfile()会在当前目录中进行搜索,因此当您向'.'提供os.listdir()时,您会获得正确的列表。

示例 -

让我们说一些文件夹 - /a/b/c - 包含文件 - xy

当你执行 - os.listdir('/a/b/c')时,返回的列表看起来像 -

['x','y']

即使你在os.listdir()内给出绝对路径,列表中返回的文件也会有相对路径到dir。您需要手动加入目录和x以获得正确的结果。

在你的第三个例子中,它不起作用,因为os.path.abspath()也适用于当前目录,所以如果你做了类似的事情 -

os.path.abspath('somefile')

产生的结果是 - /path/to/current/directory/somefile - 它不会验证这是否是真实的文件/目录。

documentation(强调我的) -

清楚地说明了这一点
  

<强> os.path.abspath则(路径)

     

返回路径名路径的规范化绝对化版本。在大多数平台上,这相当于调用函数normpath(),如下所示:normpath(join(os.getcwd(), path))

其中os.getcwd()返回当前工作目录的路径。

答案 1 :(得分:0)

isfile()正在查看当前目录。除非您在目录名中包含文件名,否则它不知道在哪里可以找到您的文件。