给文件添加时间前缀(如20181223_filename.txt),可以方便文件的管理。
之前的博客文件重命名时快速添加时间前缀介绍了怎么快速给一个文件添加时间前缀。
由于我自己平常会收集一些视频,这些视频都是采用了这种时间前缀的命名方式。
时间一久,收集的视频数量很多,有时想从中提取一些视频文件来看,主要有以下几种提取想法:
- 提取一周内的文件
- 提取近两周内的文件
- 提取近一个月的文件
- 提取最近的30个文件
- 随机提取30个文件
于是写了一个python脚本来完成这个功能。
1. 根据时间前缀提取文件
-
operation_path
是要提取的文件的根目录 -
mode
是提取的方式,目前有上述5种提取方式 - 提取的文件会放在脚本的同级目录下的一个文件夹里
20200226_extract_files_by_time_prefix.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
@author bendell02
@desc extract files by time_prefix
@date 20200226
"""
import os
import os.path
import shutil
import datetime
import re
from enum import Enum
import random
def has_time_prefix(name):
# OK example 20200226_xxxx
# length
if(len(name) <= 9):
return False
# number and _
res = re.match(r'\d{8}_', name[0:9])
if(not res):
return False
return True
def get_all_files_name(directory, filename_tuples):
files = os.listdir(directory)
for filename in files:
full_path = os.path.join(directory, filename)
if os.path.isdir(full_path):
sud_directory = full_path
get_all_files_name(sud_directory, filename_tuples)
elif has_time_prefix(filename) :
filename_tuples.append((filename, os.path.join(directory, filename)))
else:
print filename + ' is invalid.'
def is_file_ok(filename, min_time, max_time):
current_time = filename[0:8]
if(current_time>=min_time and current_time<=max_time):
return True
return False
def make_folder(folder_name):
if os.path.exists(folder_name):
shutil.rmtree(folder_name)
print 'delete ' + folder_name
os.makedirs(folder_name)
print 'make dir ' + folder_name
def copy_file(file_name, folder_name):
if os.path.exists(file_name):
shutil.copy(file_name, folder_name)
print 'copy file '+ file_name + ' to ' + folder_name + ' succeed'
else:
print '**** error **** copy file '+file_name+' failed'
class Mode(Enum):
ONE_WEEK = 1 # one week;
TWO_WEEKS = 2 # two weeks;
ONE_MONTH = 3 # one month;
FIELS_30 = 4 # get 30 files
FIELS_30_RANDOMLY = 5 # get 50 files randomly
def main():
mode = Mode.TWO_WEEKS
# mode = Mode.FIELS_30_RANDOMLY
min_time = ( datetime.date.today() + datetime.timedelta(weeks=-2) ).strftime("%Y%m%d")
max_time = datetime.datetime.now().strftime("%Y%m%d") # today
number_limit = 200
operation_path = r'E:\61_photo\81_video_small'
# analysis mode
if (Mode.ONE_WEEK == mode) :
min_time = ( datetime.date.today() + datetime.timedelta(weeks=-1) ).strftime("%Y%m%d")
elif (Mode.TWO_WEEKS == mode) :
min_time = ( datetime.date.today() + datetime.timedelta(weeks=-2) ).strftime("%Y%m%d")
elif (Mode.ONE_MONTH == mode) :
min_time = ( datetime.date.today() + datetime.timedelta(weeks=-4) ).strftime("%Y%m%d")
elif (Mode.FIELS_30 == mode or Mode.FIELS_30_RANDOMLY == mode) :
min_time = '00000000'
number_limit = 30
else :
pass
# make destination folder
dst_folder_name = min_time + "_" + max_time + "_" + str(mode)[5:]
make_folder(dst_folder_name)
# get all filenames
filename_tuples = [] # (filename, full_path)
get_all_files_name(operation_path, filename_tuples)
# sort. descending order
filename_tuples = sorted(filename_tuples, key=lambda filename_tuple: str(filename_tuple[0]), reverse=True)
# shuffle if in random mode
if(Mode.FIELS_30_RANDOMLY == mode):
random.shuffle (filename_tuples)
# current file
current_file_name = os.path.basename(__file__)
print "\n\n"
num = 0
for filename_tuple in filename_tuples:
if str(current_file_name) == str(filename_tuple[0]):
continue
if is_file_ok(filename_tuple[0], min_time, max_time):
copy_file(filename_tuple[1], dst_folder_name)
else:
print '\nbeyond time section\n'
break
num += 1
if(num >= number_limit):
print '\nbeyond number limit(' + str(number_limit) + ')...\n'
break
print '\ntotal %d files\n' % (num)
raw_input('end')
if __name__=='__main__':
main()
2. 给文件添加前时间前缀
下面的脚本是在这个博客文件重命名时快速添加时间前缀的基础上做了一些改进:
- 如果已经有了时间前缀,就不添加
- 增加还原机制
20200226_add_time_prefix.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import os.path
import shutil
import time
import re
def has_time_prefix(name):
# OK example 20200226_xxxx
# length
if(len(name) <= 9):
return False
# number and _
res = re.match(r'\d{8}_', name[0:9])
if(not res):
return False
return True
def main():
current_path = os.getcwd()
files = os.listdir(current_path)
current_file_name = os.path.basename(__file__)
time_prefix = time.strftime("%Y%m%d", time.localtime())
filenames_before_rename = []
filenames_after_rename = []
has_file_changed = False
for filename in files:
if has_time_prefix(filename):
continue
if not os.path.isdir(filename) and filename != current_file_name:
filename_after = "%s_%s" % (time_prefix, filename)
os.rename(filename, filename_after)
filenames_before_rename.append(filename)
filenames_after_rename.append(filename_after)
print filename + ' convert to ' + filename_after
has_file_changed = True
if has_file_changed:
is_ok = raw_input("is it ok? n/Y:")
else:
is_ok = ""
print 'no file changed'
if(is_ok in (["N", 'n', 'No', 'NO', 'nO', 'no'])):
for i in range(len(filenames_before_rename)):
os.rename(filenames_after_rename[i], filenames_before_rename[i])
print filenames_after_rename[i] + ' invert to ' + filenames_before_rename[i]
raw_input('end')
if __name__=='__main__':
main()
3.其他
把自己平常写的一些使用脚本放在了github上,大家如果觉得用得着,可以拿去看看:
https://github.com/bendell02/scripts
网友评论