首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对python os.path.abspath的误解

对python os.path.abspath的误解
EN

Stack Overflow用户
提问于 2014-07-12 04:05:59
回答 3查看 46.9K关注 0票数 30

我有以下代码:

代码语言:javascript
复制
directory = r'D:\images'
for file in os.listdir(directory):
    print(os.path.abspath(file))

我想要下一个输出:

  • D:\images\img1.jpg
  • D:\images\img2.jpg

但我得到了不同的结果:

  • D:\code\img1.jpg
  • D:\code\img2.jpg

其中D:\code是我当前的工作目录,结果与

代码语言:javascript
复制
os.path.normpath(os.path.join(os.getcwd(), file))

因此,问题是:当我必须使用os.path.abspath时,它的用途是什么?

代码语言:javascript
复制
os.path.normpath(os.path.join(directory, file))

来获得我的文件的真实绝对路径?如果可能的话,展示真实的用例。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-12 04:12:53

问题出在你对os.listdir()的理解上,而不是os.path.abspath()os.listdir()返回目录中每个文件的名称。这将为您提供:

代码语言:javascript
复制
img1.jpg
img2.jpg
...

当您将这些路径传递给os.path.abspath()时,它们被视为相对路径。这意味着它相对于执行代码的目录。这就是为什么你会得到"D:\code\img1.jpg“。

相反,您要做的是将文件名与您列出的目录路径连接起来。

代码语言:javascript
复制
os.path.abspath(os.path.join(directory, file))
票数 40
EN

Stack Overflow用户

发布于 2014-07-12 04:12:02

listdir生成目录中的文件名,而不引用目录本身的名称。在没有任何其他信息的情况下,abspath只能从它所知道的唯一目录形成绝对路径:当前工作目录。您始终可以在循环之前更改工作目录:

代码语言:javascript
复制
os.chdir(directory)
for f in os.listdir('.'):
    print(os.path.abspath(f))
票数 5
EN

Stack Overflow用户

发布于 2014-07-12 04:59:04

Python的原生os.listdiros.path函数相当低级。遍历一个目录(或一系列降级目录)需要您的程序手动组装文件路径。可以方便地定义一个实用函数来生成您只需要一次的路径,这样路径汇编逻辑就不必在每次目录迭代中重复。例如:

代码语言:javascript
复制
import os

def better_listdir(dirpath):
    """
    Generator yielding (filename, filepath) tuples for every
    file in the given directory path.
    """
    # First clean up dirpath to absolutize relative paths and
    # symbolic path names (e.g. `.`, `..`, and `~`)
    dirpath = os.path.abspath(os.path.expanduser(dirpath))

    # List out (filename, filepath) tuples
    for filename in os.listdir(dirpath):
        yield (filename, os.path.join(dirpath, filename))

if __name__ == '__main__':
    for fname, fpath in better_listdir('~'):
        print fname, '->', fpath

或者,可以使用“更高级别”的路径模块,例如py.pathpath.pypathlib (现在是Python3.4版及更高版本的标准部分,但在2.7版本中可用)。这些为您的项目添加了依赖关系,但增加了文件、文件名和文件路径处理的许多方面。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24705679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档