2017-05-30 78 views
0

我在桌面文件夾(Ubuntu)中有各種tar文件。按文件名內的日期順序列出目錄中的所有文件?

的文件名是這樣的:

esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-**05222017**-4.tar 

加粗的部分是日期。我想按照日期順序對文件進行排序,最近的排在第一位。

是否有一個簡單的Python解決方案呢?

import glob 
import datetime 
import re 

timeformat = "%m%d%Y" 

regex = re.compile("^esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-(\d*\d*)") 

def gettimestamp(thestring): 

    m = regex.search(thestring) 
    return datetime.datetime.strptime(m.groups()[0], timeformat) 


list_of_filenames = ['esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05212017-4','esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05202017-4'] 

for fn in sorted(list_of_filenames, key=gettimestamp): 

    print fn 
+2

你有沒有試過的代碼? –

+0

是的,它似乎有工作時,我有list_of_filenames變量。也許有關如何將變量指向我的目錄的建議?這就是我主要堅持的部分:( –

+0

@ChetanYadav ['os.listdir'](https://docs.python.org/3/library/os.html?highlight=os.listdir#os.listdir) –

回答

0

你不需要解析日期,甚至不需要使用正則表達式。如果像你說的文件名是結構化的,它足以只是做:

filenames = ['esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05212017-4', 
      'esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05202017-4', 
      'esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-bad_date-4',] 

def parse_date(name, offset=-10): 
    try: 
     date_str = name[offset:offset+8] 
     return int(date_str[-4:] + date_str[:2] + date_str[2:4]) 
    except (IndexError, TypeError, ValueError): # invalid file name 
     return -1 

sorted_list = [x[1] for x in sorted((parse_date(l), l) for l in filenames) if x[0] != -1] 
# ['esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05202017-4', 
# 'esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05212017-4'] 

UPDATE - 我已經添加了偏移參數指定的文件名開頭的日期。在你發佈的列表中,它從後面開始有10個字符(默認),但是如果你的名字後面有一個.tar的擴展名,就像在你的第一個例子中一樣,你也要記錄這4個字符,並使用offset -14:

names = ['James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05212017-4.tar', 
     'James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05202017-4.tar', 
     'James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-bad_date-4.tar'] 

sorted_list = [x[1] for x in sorted((parse_date(l, -14), l) for l in names) if x[0] != -1] 
# ['James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05202017-4.tar', 
# 'James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05212017-4.tar'] 
+0

似乎不是 –

+0

@ChetanYadav - 那麼你的文件名是不同的結構 - 如果你逐字複製上面的代碼,它會工作併產生預期的輸出。它基於你沒有放置文件擴展名的'list_of_filenames'列表,你必須添加額外的偏移量來告訴'parse_date()'函數在哪裏查找日期。查看上面更新的例子。 – zwer

+0

我已經逐字地試過了。足夠奇怪地返回一個空白輸出! –

1

不,不是這樣的簡單的Python功能。但是,有相當簡單的構建塊可供您從中製作可讀解決方案。

編寫一個函數來提取日期並重新排列它以作爲排序關鍵字。在文件名中查找最後兩個連字符,獲取它們之間的字符串,然後按yyyymmdd(年 - 月 - 日)格式重新排列數字。返回該字符串或整數(或者將工作)作爲功能值。

對於您的主例程,收集列表中的所有文件名(或生成一個生成器)並對它們進行排序,使用該函數的值作爲排序關鍵字。

查看sorting wiki瞭解一些實施細節。

1

正如Adam Smith指出的那樣,您需要使用文件列表。

import glob, os 
import datetime 
import re 

timeformat = "%m%d%Y" 

regex = re.compile("(\d*\d*)-\d*.tar") 

def gettimestamp(thestring): 

    m = regex.search(thestring[-14:-1]) 
    if m: 
     return datetime.datetime.strptime(m.groups()[0], timeformat) 
    else: 
     return None 


list_of_filenames = os.listdir('/home/james/Desktop/tarfolder') 

for fn in sorted(list_of_filenames, key=gettimestamp): 
    print fn 

編輯作爲Martineu已經注意到,散列可能比你表示這樣它會更容易放棄的名稱部分開頭提前的不同。

+0

好的解決方案。只是想知道這WH彈出: - 回溯(最近最後一次通話): 文件 「listfiles.py」 17行,在 爲FN在排序(list_of_filenames,鍵= gettimestamp): 文件 「listfiles.py」 ,第12行,在gettimestamp return datetime.datetime.strptime(m.groups()[0],timeformat) AttributeError:'NoneType'對象沒有屬性'groups' –

+0

您使用的是python2.7還是python3? –

+0

@Budo:在調用'm.groups()'之前,你需要檢查'如果m:' - 顯然不是所有的文件名都有日期。 – martineau

相關問題