鍍金池/ 問(wèn)答/Python/ 為什么os.path.abspath()獲取的不是真實(shí)路徑

為什么os.path.abspath()獲取的不是真實(shí)路徑

當(dāng)我使用os.path.abspath()獲取文件絕對(duì)路徑的時(shí)候,為什么總是得到像"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
>>> 
回答
編輯回答
互擼娃

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

2017年10月31日 23:07
編輯回答
她愚我

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

    import os
    # ur codes object f
    f_path = os.chdir(f)
    # now get ur abs path 
2017年3月3日 02:17
編輯回答
紓惘

問(wèn)題在于您對(duì) os 的理解, listdir()工作方式是列出某路徑下的全部文件名, 注意是文件名,不是文件實(shí)體,這一點(diǎn)很重要, os.path.abspath()的作用是對(duì)給定文件名前加上當(dāng)前工作目錄的絕對(duì)路徑,至于你給定的文件名對(duì)應(yīng)文件是否真的存在并不關(guān)心(因?yàn)槟阌锌赡苁窍胍獎(jiǎng)?chuàng)建文件呢), os.listdir() 返回目錄中每個(gè)文件的名稱(chēng)。這將給你:

xxx.mp4
yyy.mp4
...

當(dāng)您將這些傳遞給 os.path.abspath () 時(shí), 它們被視為相對(duì)路徑。這意味著它相對(duì)于您正在執(zhí)行代碼的目錄。這就是為什么你要 "E:WorkspacePythonxxx.mp4 " 的原因。

象你問(wèn)題中的情況, 只要將文件名與正在列出的目錄路徑聯(lián)接起來(lái)就好:

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

os.path.abspath只簡(jiǎn)單地刪除...類(lèi)似的東西, 并給出從當(dāng)前目錄的根目錄到文件名 (或 symlink) 的路徑提供完整路徑. 如果你給出的是絕對(duì)路徑(windows下以盤(pán)符開(kāi)始,*nix下以/開(kāi)始)且沒(méi)有...之類(lèi)的, 則os.path.abspath什么也不做.

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

2018年6月1日 18:19