【问题标题】:Set file name with auto-number使用自动编号设置文件名
【发布时间】:2019-06-19 15:30:16
【问题描述】:

这里是 Python 初学者:我写了一个脚本,它每 3 分钟创建一个文件,我使用 strftime 根据创建日期/时间来设置名称:

dt = datetime.now()
dtTemp = dt.strftime('%d-%b-%Y - %H-%M-%S')
filename = '/home/pi/baby_lapse/%s.jpg' % dtTemp

这是一个输出示例:

2019 年 1 月 18 日 - 23-21-03.jpg

问题是,一旦我拥有超过一个月的文件,按文件名对文件进行排序就会产生问题,这对我来说很重要。

为了解决这个问题,我想在 strftime 字符串之前添加一些自动编号,这样它就会产生如下输出:

000 - 2019 年 1 月 18 日 - 23-21-03.jpg

001 - 2019 年 1 月 18 日 - 23-24-03.jpg

002 - 2019 年 1 月 18 日 - 23-27-03.jpg

如何实现?

【问题讨论】:

  • 使用按字典顺序排列的日期格式,如2019-01-18
  • 会使用 yyyy-mm-dd HH-MM-ss,为每个唯一的 yyyy 创建文件夹,然后为一年中的每个 mm 创建一个文件夹,然后将文件保存到这些文件夹中,这是一个优雅的解决方案你呢?
  • 我通常使用格式 yyyymmdd-HHMMss 来完成此类任务。

标签: python filenames auto-increment


【解决方案1】:

我认为更好的办法是将日期格式更改为数字格式,例如%Y-%m-%d %H:%M:%S。通过这样做,可以很容易地按名称对文件进行排序。例如,

/home/pi/baby_lapse/2019-01-26 20:51:42.jpg
/home/pi/baby_lapse/2019-01-26 20:51:43.jpg

等等……

考虑到您的情况,刚刚尝试了一个示例脚本,我得到了一个更具可读性的结果

代码

for _ in range(10):
    dt = datetime.now()
    dtTemp = dt.strftime('%Y-%m-%d %H:%M:%S')
    filename = '/home/pi/baby_lapse/%s.jpg' % dtTemp
    print(filename)
    time.sleep(0.5)

结果

/home/pi/baby_lapse/2019-01-26 20:51:42.jpg
/home/pi/baby_lapse/2019-01-26 20:51:43.jpg
/home/pi/baby_lapse/2019-01-26 20:51:43.jpg
/home/pi/baby_lapse/2019-01-26 20:51:44.jpg
/home/pi/baby_lapse/2019-01-26 20:51:44.jpg
/home/pi/baby_lapse/2019-01-26 20:51:45.jpg
/home/pi/baby_lapse/2019-01-26 20:51:45.jpg
/home/pi/baby_lapse/2019-01-26 20:51:46.jpg
/home/pi/baby_lapse/2019-01-26 20:51:46.jpg
/home/pi/baby_lapse/2019-01-26 20:51:47.jpg

【讨论】:

    【解决方案2】:

    我决定遵循@chepner 的建议并使用2019-01-18 作为日期格式。

    为将来的记录设置日期格式后,我必须运行数据修复并修复现有记录的命名。

    我最终编写了自己的脚本,将文件名从这种18-Jan-2019 - 23-21-03.jpg 格式转换为2019-01-18 - 23-21-03.jpg,我分享它以防有人遇到类似情况:

    import os
    Months = {
        "Jan": "01",
        "Feb": "02",
        "Mar": "03",
        "Apr": "04",
        "May": "05",
        "Jun": "06",
        "Jul": "07",
        "Aug": "08",
        "Sep": "09",
        "Oct": "10",
        "Nov": "11",
        "Dec": "12"
    }
    
    for filename in os.listdir("."):
      originalDateTime = filename.split(' ') #example: 18-Jan-2019 - 23-21-03.jpg
      date = originalDateTime[0] #18-Jan-2019
      datesplit = date.split('-') # '18', 'Jan', '2019'
      dayOfMonth = datesplit[0] #18
      month = datesplit[1] #Jan
      year = datesplit[2] #2019
      newFileName = year + '-' + Months.get(month, "none") + '-' + dayOfMonth + ' - ' + originalDateTime[2]
      print newFileName # 2019-01-18 - 23-21-03
      os.rename(filename, newFileName)
    

    【讨论】:

      【解决方案3】:

      如果您只是在开头添加自纪元以来的毫秒数,它将始终按日期排序。为了便于阅读,您可以将人类可读的日期字符串留在那里。

      要获得自纪元以来的毫秒数,只需使用 time.time() * 1000

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-26
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多