问题描述

承接上节的问题,在安卓和苹果间互导照片和视频还容易出现文件名混乱的问题,如下图所示。
利用文件时间批量重命名照片和视频 - 图1

代码实现

为保证文件名的准确性,这里主要提取照片的拍摄时间和视频的修改时间用于重命名,这两个时间一般是其原始时间,实现代码如下:

  1. import os
  2. import re
  3. import time
  4. import exifread
  5. def get_file_date(filepath, format):
  6. '''
  7. 获取文件的时间戳,这里主要返回视频的时间,原时间一般为修改时间
  8. st_atime (访问时间), st_mtime (修改时间), st_ctime(创建时间)
  9. '''
  10. statinfo = os.stat(filepath)
  11. temp_time = time.localtime(statinfo.st_mtime)
  12. return time.strftime(format, temp_time)
  13. def get_exif_date(filepath):
  14. # 获取照片的拍摄日期,利用exifread模块
  15. FIELD = 'EXIF DateTimeOriginal'
  16. fd = open(filepath, 'rb')
  17. tags = exifread.process_file(fd)
  18. fd.close()
  19. if FIELD in tags:
  20. temp_time = str(tags[FIELD])
  21. new_time = temp_time.replace(':', '').replace(' ', '_')
  22. return new_time
  23. else:
  24. new_time=''
  25. return new_time
  26. def get_filetype(basename):
  27. '''
  28. 利用正则表达式判断文件后缀,照片返回0,视频返回1,其他返回2
  29. '''
  30. img_reg = r'(\.JPG|\.jpg|\.bmp|\.png)'
  31. vedio_reg = r'(\.mp4|\.MP4|\.MOV|\.mov)'
  32. if re.search(img_reg, basename): # 匹配照片
  33. return 0
  34. elif re.search(vedio_reg, basename): # 匹配视频
  35. return 1
  36. else:
  37. return 2
  38. if __name__ == "__main__":
  39. dirname = r'D:\资料\照片\15-18'
  40. os.chdir(dirname) # 切换至当前目录
  41. basenames = os.listdir(dirname)
  42. format = '%Y%m%d_%H%M%S' # 时间格式
  43. for basename in basenames:
  44. filepath = dirname+'\\'+basename
  45. num = get_filetype(basename) #判定文件类型
  46. # 获取文件时间
  47. if num == 0:
  48. exif_time = str(get_exif_date(filepath)) # 获取照片拍摄时间
  49. if exif_time != '':
  50. str_time = exif_time
  51. else:
  52. str_time = str(get_file_date(filepath, format)) # 获取文件的修改时间
  53. elif num == 1:
  54. str_time = str(get_file_date(filepath, format))
  55. else:
  56. print(basename+"---文件格式不正确!")
  57. # 重命名
  58. file_suffix=os.path.splitext(basename)[1] #后缀名
  59. try:
  60. newname = str_time+file_suffix
  61. os.rename(basename, newname)
  62. print(basename+'---重命名成功!')
  63. except Exception as e:
  64. if e.args[0] ==17: #重名
  65. newname=str_time+'-1'+file_suffix
  66. os.rename(basename,newname)
  67. else:
  68. print(e)

结论

最后修改结果如下。
利用文件时间批量重命名照片和视频 - 图2