我正在尝试这样做:
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))]
只输出[]
为什么?
答案 0 :(得分:4)
由于您需要将dirname
加入x
,os.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
- 包含文件 - x
和y
。
当你执行 - 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()
正在查看当前目录。除非您在目录名中包含文件名,否则它不知道在哪里可以找到您的文件。