Python 是否按文件名中的日期顺序列出目录中的所有文件?

Python 是否按文件名中的日期顺序列出目录中的所有文件?,python,Python,我在桌面文件夹(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(

我在桌面文件夹(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
不,没有一个简单的Python函数用于此。然而,有一些相当简单的构建块,您可以从中生成可读的解决方案

编写一个函数来提取日期,并将其重新排列,以便用作排序键。找到文件名中的最后两个连字符,抓住它们之间的字符串,然后按yyyymmdd(年-月-日)格式重新排列数字。返回该字符串或整数(两者都可以)作为函数值

对于主例程,收集列表中的所有文件名(或生成一个生成器),并使用该函数的值作为排序键对其进行排序

有关一些实现的详细信息,请参见。

不,没有一个简单的Python函数用于此。然而,有一些相当简单的构建块,您可以从中生成可读的解决方案

编写一个函数来提取日期,并将其重新排列,以便用作排序键。找到文件名中的最后两个连字符,抓住它们之间的字符串,然后按yyyymmdd(年-月-日)格式重新排列数字。返回该字符串或整数(两者都可以)作为函数值

对于主例程,收集列表中的所有文件名(或生成一个生成器),并使用该函数的值作为排序键对其进行排序


有关一些实现的详细信息,请参见。

正如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所注意到的,散列可能与您指定的散列不同,因此更容易提前放弃名称部分的开头。

正如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所注意到的,散列可能与您指定的散列不同,因此更容易提前放弃名称部分的开头。

您不需要解析日期,甚至不需要使用正则表达式。如果文件名的结构如您所说,只需执行以下操作即可:

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']
更新-我添加了offset参数来指定日期在文件名中的起始位置。在您发布的列表中,它从后面开始10个字符(默认值),但是如果您在名称后面有一个
.tar
扩展名,如您最初的示例所示,您还需要考虑这4个字符,并使用-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']

您不需要解析日期,甚至不需要使用正则表达式。如果文件名的结构如您所说,只需执行以下操作即可:

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']
更新-我添加了offset参数来指定日期在文件名中的起始位置。在您发布的列表中,它从后面开始10个字符(默认值),但是如果您在名称后面有一个
.tar
扩展名,如您最初的示例所示,您还需要考虑这4个字符,并使用-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']


你有一些你尝试过的代码吗?是的,当我有list\u of\u filenames变量时,它似乎起作用了。也许有一些关于如何将变量指向我的目录的建议?这是我主要停留在的部分:(@ChetanYadav)你的文件在文件名的末尾总是有一个
-number
吗?是的,Budo。他们有。你有一些你尝试过的代码吗?是的,当我有文件名列表变量时,它似乎起作用了。也许有一些关于如何将变量指向我的目录的建议?这是我主要停留的部分:(@ChetanYadav)您的文件是否总是在文件名末尾有一个
-number
?是的,Budo。他们确实有。很好的解决方案。只是想知道这会弹出什么:-回溯(最近一次调用):文件“listfiles.py”,第17行,in for fn in sorted(文件名列表,key=gettimestamp):文件“listfiles.py”,第12行,在gettimestamp return datetime.datetime.strptime(m.groups()[0],timeformat)AttributeError:“非类型”对象没有属性“组”,您使用的是python2.7还是python3?@Budo:在调用
m.groups()之前,您需要检查
如果m:
-显然不是所有文件名都有日期。使用python 2。7@martineau或者更可能的是,十六进制的随机位在文件之间实际上并不相同(
8037affd-06d1-4c61-a91f-816ec9cb825f
我的意思是)很好的解决方案。只是想知道这会弹出什么:-回溯(最后一次调用):文件“listfiles.py”,第17行,in for fn in排序(文件名列表,key=gettimestamp):文件“listfiles.py”,第12行,在gettimestamp return datetime.datetime.strtime(m.groups()[0],timeformat)中AttributeError:'NoneType'对象没有属性'groups'。您使用的是python2.7还是python3?@Budo:在调用
m.groups()
之前,您需要检查
是否m:
-显然不是所有文件名都有日期。使用python 2。7@martineau或者更可能的是,十六进制的随机位在文件之间实际上并不相同(
8037affd-06d1-4c61-a91f-816ec9cb825f
@ChetanYadav-那么你的文件名是不同的结构-如果你逐字复制上面的代码,它将工作并产生预期的输出。它基于你没有放置文件扩展名的
文件名列表
列表,对于文件扩展名,你必须添加额外的偏移量来告诉
解析日期()
函数在何处查找日期。检查上面更新的示例。我逐字尝试了您的示例。奇怪的是,它返回空白输出!当然它返回空白输出-它不打印任何内容,它生成
排序列表
,然后您可以对其执行任何操作,包括打印。哦,是的!请原谅我的小错误对!非常感谢Zwer!它现在起作用了!你是一个救世主!:)最后一次跟进,任何我想要的