【问题标题】:Python: Parsing Timestamps Embedded in FilenamesPython:解析嵌入在文件名中的时间戳
【发布时间】:2013-08-08 08:23:51
【问题描述】:

我正在开发一个支持头像的 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

它工作正常,但是遍历由顺序正则表达式返回的列表中的列表所必需的双 [0][0] 弹出有点令人反感,总的来说,这一切似乎有点生硬。此外,尽管虚拟形象实际上分布在许多目录中(由 user_id 自动生成,但这在这里并不重要),但我认为如果目录非常大,暴力正则表达式搜索可能会影响性能。

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

【问题讨论】:

    标签: python regex django


    【解决方案1】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2020-05-27
      • 2018-07-02
      • 1970-01-01
      • 2013-03-11
      • 2014-10-06
      • 2017-04-13
      • 1970-01-01
      • 2021-07-25
      • 2017-11-22
      相关资源
      最近更新 更多