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

os.path.isfile() doesn't work. Why?

我正在尝试这样做:

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))] 

只输出[]

为什么?

因为需要加入dirnamexos.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 - 它不会验证那是否是真实的 file/dir。

documentation(强调我的)中明确说明-

os.path.abspath(path)

Return a normalized absolutized version of the pathname path. On most platforms, this is equivalent to calling the function normpath() as follows: normpath(join(os.getcwd(), path)).

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

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