关于Python:Python – 基于时间戳排序文件

Python - Sort files based on timestamp

我有一个包含文件名列表的列表,我想根据时间戳进行排序,每个文件名中都内置了时间戳。

注:在文件中,hello_hi_2015-02-20t084521_1424543480.tar.gz->2015-02-20t084521表示"年蛾日数"(基于此我想排序)

下面的输入文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
file_list = ['Hello_Hi_2015-02-20T084521_1424543480.tar.gz',  
'Hello_Hi_2015-02-20T095845_1424543481.tar.gz',  
'Hello_Hi_2015-02-20T095926_1424543481.tar.gz',  
'Hello_Hi_2015-02-20T100025_1424543482.tar.gz',  
'Hello_Hi_2015-02-20T111631_1424543483.tar.gz',  
'Hello_Hi_2015-02-20T111718_1424543483.tar.gz',  
'Hello_Hi_2015-02-20T112502_1424543483.tar.gz',  
'Hello_Hi_2015-02-20T112633_1424543484.tar.gz',  
'Hello_Hi_2015-02-20T113427_1424543484.tar.gz',  
'Hello_Hi_2015-02-20T113456_1424543484.tar.gz',  
'Hello_Hi_2015-02-20T113608_1424543484.tar.gz',  
'Hello_Hi_2015-02-20T113659_1424543485.tar.gz',  
'Hello_Hi_2015-02-20T113809_1424543485.tar.gz',  
'Hello_Hi_2015-02-20T113901_1424543485.tar.gz',  
'Hello_Hi_2015-02-20T113955_1424543485.tar.gz',  
'Hello_Hi_2015-03-20T114122_1424543485.tar.gz',  
'Hello_Hi_2015-02-20T114532_1424543486.tar.gz',  
'Hello_Hi_2015-02-20T120045_1424543487.tar.gz',  
'Hello_Hi_2015-02-20T120146_1424543487.tar.gz',  
'Hello_WR_2015-02-20T084709_1424543480.tar.gz',  
'Hello_WR_2015-02-20T113016_1424543486.tar.gz']

输出应为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
file_list = ['Hello_Hi_2015-02-20T084521_1424543480.tar.gz',  
'Hello_WR_2015-02-20T084709_1424543480.tar.gz',  
'Hello_Hi_2015-02-20T095845_1424543481.tar.gz',  
'Hello_Hi_2015-02-20T095926_1424543481.tar.gz',  
'Hello_Hi_2015-02-20T100025_1424543482.tar.gz',  
'Hello_Hi_2015-02-20T111631_1424543483.tar.gz',  
'Hello_Hi_2015-02-20T111718_1424543483.tar.gz',  
'Hello_Hi_2015-02-20T112502_1424543483.tar.gz',  
'Hello_Hi_2015-02-20T112633_1424543484.tar.gz',  
'Hello_WR_2015-02-20T113016_1424543486.tar.gz',  
'Hello_Hi_2015-02-20T113427_1424543484.tar.gz',  
'Hello_Hi_2015-02-20T113456_1424543484.tar.gz',  
'Hello_Hi_2015-02-20T113608_1424543484.tar.gz',  
'Hello_Hi_2015-02-20T113659_1424543485.tar.gz',  
'Hello_Hi_2015-02-20T113809_1424543485.tar.gz',  
'Hello_Hi_2015-02-20T113901_1424543485.tar.gz',  
'Hello_Hi_2015-02-20T113955_1424543485.tar.gz',  
'Hello_Hi_2015-02-20T114532_1424543486.tar.gz',  
'Hello_Hi_2015-02-20T120045_1424543487.tar.gz',  
'Hello_Hi_2015-02-20T120146_1424543487.tar.gz',  
'Hello_Hi_2015-03-20T114122_1424543485.tar.gz']

下面是我尝试过的代码。

1
2
3
4
5
6
7
def sort( dir ):
   os.chdir( dir )
   file_list = glob.glob('Hello_*')
   file_list.sort(key=os.path.getmtime)
   print("
".join(file_list))
   return 0

事先谢谢!!


所以这对我很有用,它按创建的时间对文件进行排序,而创建的时间在名称中没有时间戳;

1
2
3
4
5
6
7
8
import os
import re

files = [file for file in os.listdir(".") if (file.lower().endswith('.gz'))]
files.sort(key=os.path.getmtime)

for file in sorted(files,key=os.path.getmtime):
    print(file)


这行吗?

您可以将列表内容逐行写入文件并读取该文件:

1
2
lines = sorted(open(open_file).readlines(), key = lambda line :        
line.split("_")[2])

此外,您还可以打印出行。


您的代码试图基于文件系统存储的修改时间而不是文件名时间进行排序。

由于您的文件名编码有点健全:-)如果您只想基于文件名进行排序,可以使用:

1
sorted(os.listdir(dir), key=lambda s: s[9:]))

这样就可以了,但仅仅是因为文件名中的时间戳编码是健全的:固定长度前缀、零填充、常量宽度数字,从最大时间引用(年)到最小时间引用(秒)。

如果前缀不固定,可以使用regexp尝试以下操作(它将按第二个下划线后的值排序):

1
2
3
import re
pat = re.compile('_.*?(_)')
sorted(os.listdir(dir), key=lambda s: s[pat.search(s).end():])