Python:解析嵌入在文件名中的时间戳

时间:2013-08-08 08:23:52

标签: python regex django

我正在开发一个具有头像支持的django项目,系统(这不是最好但需要维护)要求我们在用户生成的头像文件中嵌入YYYYMMDDHHMM形式的时间戳,并使用user_id,例如:

23_201308080930.png

我编写了一个解析这些文件名并返回最新时间戳的函数:

def _get_timestamp(self):
    """Return the timestamp of a user's most recently uploaded avatar."""
    path = settings.USER_AVATAR_DIRECTORY + self._get_dir()
    user_id = self.user_id
    file_re = re.escape(str(user_id)) + r"_\d{12}.png"
    times = []
    [times.append(file) for file in os.listdir(path) if re.match(file_re, file)]
    if times:
        digits = [re.findall("\d{12}", timestamp) for timestamp in times]
        timestamp = sorted(digits, reverse=True)[0][0]
        return timestamp

它工作正常,但是在顺序regexen返回的列表中遍历列表所需的double [0] [0] pop有点令人反感,总体而言似乎有点生硬。此外,虽然化身实际上分布在许多目录上(由user_id自动生成,但这在这里并不重要),我觉得如果目录非常大,可能是强力正则表达式搜索可能会影响性能。

我很想知道这个问题的最佳和惯用解决方案是什么?它是生成器的候选者还是某种形式的懒惰评估?

1 个答案:

答案 0 :(得分:2)

我不会为此使用正则表达式;当你真的不需要它们时,最好避免使用它们。我是这样做的(未经测试):

def _get_timestamp(self):
    """Return the timestamp of a user's most recently uploaded avatar."""
    path = settings.USER_AVATAR_DIRECTORY + self._get_dir()
    filenames = [filename for filename in os.listdir(path)
                 if filename.partition('_')[0] == str(self.user_id)]
    filenames.sort(reverse=True)
    return (filenames[0].rpartition('_')[2].partition('.')[0]
            if filenames else None)