2016-01-21 28 views
0

我想獲取最新創建的目錄。我跟着這個post。但是當我嘗試它時會出現錯誤。嘗試在python中獲取最新創建的目錄時出錯

這裏是我的目錄列表

ls backups 
    BACKUPSET_2016-01-14_11-26_.zip DIFF-2016-01-17_00-00 DIFF-2016-01-20_00-00 
    BACKUPSET_2016-01-14_11-28_.zip DIFF-2016-01-18_00-00 DIFF-2016-01-21_00-00 
    DIFF-2016-01-16_00-00   DIFF-2016-01-19_00-00 FULL-2016-01-14_14-11 

我想獲得最新創建的文件以「DIFF」

開始這裏是我試過了。

def get_latest_directory(): 
    all_dirs = [d for d in os.listdir('backups') if (os.path.isdir(d) and d.startswith('DIFF'))] 
    print sorted(all_dirs, key=lambda x: os.path.getctime(x), reverse=True)[0] 

if __name__=="__main__": 
    get_latest_directory() 

當我運行該腳本,我得到

./backup.py 
Traceback (most recent call last): 
    File "./backup.py", line 33, in <module> 
    get_latest_directory() 
    File "./backup.py", line 19, in get_latest_directory 
    print sorted(all_dirs, key=lambda x: os.path.getctime(x), reverse=True)[0] 
IndexError: list index out of range 

我做了上述

def get_latest_directory(): 
    all_dirs = [d for d in os.listdir('backups')] 
    print sorted(all_dirs, key=lambda x: os.path.getctime(x), reverse=True)[0] 

在功能上的微小變化,現在我得到:

Traceback (most recent call last): 
    File "./backup.py", line 34, in <module> 
    get_latest_directory() 
    File "./backup.py", line 20, in get_latest_directory 
    print sorted(all_dirs, key=lambda x: os.path.getctime(x), reverse=True)[0] 
    File "./backup.py", line 20, in <lambda> 
    print sorted(all_dirs, key=lambda x: os.path.getctime(x), reverse=True)[0] 
    File "/usr/lib64/python2.7/genericpath.py", line 64, in getctime 
    return os.stat(filename).st_ctime 
OSError: [Errno 2] No such file or directory: 'FULL-2016-01-14_14-11' 

這確實因爲我直接看到這一點,所以沒有意義ory'FULL-2016-01-14_14-11'當我執行ls命令。

我做錯了什麼。我無法弄清楚。

感謝

+0

我的猜測是你需要完整的路徑名。 'listdir'沒有給出完整路徑 – SirParselot

+0

你需要''.path.join',但我不知道你爲什麼不使用glob,因爲它也在鏈接問題中使用 –

回答

2

您需要完整的路徑名稱,這樣只需將其添加到d列表理解

def get_latest_directory(): 
    path_to_backups = 'path/to/backups/' 
    all_dirs = [path_to_backsups + d for d in os.listdir(path_to_backups) if (os.path.isdir(path_to_backups + d) and d.startswith('DIFF'))] 
    print sorted(all_dirs, key=lambda x: os.path.getctime(x), reverse=True)[0] 

if __name__=="__main__": 
    get_latest_directory() 
+0

它對'all_dirs = [d for os.listdir('backups')if(os.path.isdir(d)and d.startswith('DIFF'))]' –

+0

我給+1了。有人downvoted –

+1

@brainstorm對不起,我原來的答案我認爲你已經修復了你的列表理解,但看着它更接近我意識到你仍然錯過了完整的路徑。這會導致'os.path.isdir(d)'失敗,這會導致'all_dirs'爲空 – SirParselot

0

由於SirParselot介紹,你需要完整的路徑,而os.listdir()只是給你的相對路徑。要解決此問題,請使用os.path.abspath(),它將相對路徑映射到絕對路徑。

[os.path.abspath(d) for d in os.listdir('backups') if (...)] 
+0

'os.path.abspath(d)'會給你所在的目錄的完整路徑不一定是你想要的路徑 – SirParselot

相關問題