为什么os.path.abspath()获取的不是真实路径

当我使用os.path.abspath()获取文件绝对路径的时候,为什么总是得到像"workspace"+"filename"这样的路径?

import os

dir = "E:/Videos"

for f in os.listdir(dir):
    print(os.path.abspath(f))

输出是:

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> 
==================== RESTART: E:/Workspace/Python/Test.py ====================
E:\Workspace\Python\13.gif
E:\Workspace\Python\b0020dgz88t.p401.1.mp4
E:\Workspace\Python\c0021dj07u4.p401.1.mp4
E:\Workspace\Python\n0021jtr5c6.p401.1.mp4
E:\Workspace\Python\o0019ba3fy0.p401.1.mp4
E:\Workspace\Python\x0021k863rf.p401.1.mp4
E:\Workspace\Python\z0015vpyqkv.p402.1.mp4
>>> 
阅读 20.3k
3 个回答

问题在于您对 os 的理解, listdir()工作方式是列出某路径下的全部文件名, 注意是文件名,不是文件实体,这一点很重要, os.path.abspath()的作用是对给定文件名前加上当前工作目录的绝对路径,至于你给定的文件名对应文件是否真的存在并不关心(因为你有可能是想要创建文件呢), os.listdir() 返回目录中每个文件的名称。这将给你:

xxx.mp4
yyy.mp4
...

当您将这些传递给 os.path.abspath () 时, 它们被视为相对路径。这意味着它相对于您正在执行代码的目录。这就是为什么你要 "E:WorkspacePythonxxx.mp4 " 的原因。

象你问题中的情况, 只要将文件名与正在列出的目录路径联接起来就好:

import os
dir = "E:/Videos"
for f in os.listdir(dir):
    print(os.path.abspath(os.path.join(dir, f)))

os.path.abspath只简单地删除...类似的东西, 并给出从当前目录的根目录到文件名 (或 symlink) 的路径提供完整路径. 如果你给出的是绝对路径(windows下以盘符开始,*nix下以/开始)且没有...之类的, 则os.path.abspath什么也不做.

参考:
https://stackoverflow.com/a/2...

listdir獲取的只是文件夾下的文件/文件夾, 並不能獲取其完整路徑, 而運行時python只知道當前的工作路徑(work directory), 所以輸出如你所見. 你可以os.chdir(directory)來重新定位工作路徑, 這樣就能按你所想的輸出了

新手上路,请多包涵

你需要先重定向到f目录下

    import os
    # ur codes object f
    f_path = os.chdir(f)
    # now get ur abs path 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏