首页 > 解决方案 > 为什么我的代码返回脚本路径而不是绝对文件路径?

问题描述

我在 Python 中遇到了一个让我发疯的小问题。我的代码包含一个非常简单的os.walk()函数,它应该在测试文件夹中找到所有文件及其路径(这个测试文件夹由各种子文件夹组成)。

import os

src=r"C:\Users\j2the\Documents\Test3"

for dirpath,dirnames,filenames in os.walk(src):
    for e in filenames:
        print(e)
        print(os.path.abspath(e))

现在,当我运行代码时,它会打印正确的文件名。但是,即使我使用了os.path.abspath()语句,返回的文件路径始终是我的pycharm项目的脚本路径,也就是说"C:\Users\j2the\PycharmProjects\...".

那么为什么 Python 返回脚本路径而不是文件的绝对路径,应该是这样的"C:\Users\j2the\Documents\Test3\..."

注意:我的 Pycharm 配置不是问题,因为我在 IDLE 上运行了相同的代码,它仍然返回脚本路径

在此先感谢您的帮助!:)

标签: pythonfor-looppathos.walk

解决方案


该变量e只是文件名的字符串。它不包含任何关于它在哪里的信息。如果我们将其与以下文档abspath相结合:

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

因此pathequals e,它只是一个文件名,比如说my_file.txt。并且os.getcwd()是运行脚本的路径。

查看的文档os.walk,我们可以看到:

dirpath 是一个字符串,是目录的路径。dirnames 是 dirpath 中子目录名称的列表(不包括 '.' 和 '..')。filenames 是 dirpath 中非目录文件的名称列表。请注意,列表中的名称不包含路径组件。要获得 dirpath 中文件或目录的完整路径(以 top 开头),请执行 os.path.join(dirpath, name)。

*我的重点

现在我们可以结合这两个知识并产生这个:

import os

src=r"C:\Users\j2the\Documents\Test3"

for dirpath,dirnames,filenames in os.walk(src):
    for e in filenames:
        print(e)
        print(os.path.abspath(os.path.join(dirpath, e)))

推荐阅读