美文网首页
【实用脚本】用python实现按照时间前缀来提取文件

【实用脚本】用python实现按照时间前缀来提取文件

作者: book_02 | 来源:发表于2020-02-28 19:22 被阅读0次

给文件添加时间前缀(如20181223_filename.txt),可以方便文件的管理。

之前的博客文件重命名时快速添加时间前缀介绍了怎么快速给一个文件添加时间前缀。

由于我自己平常会收集一些视频,这些视频都是采用了这种时间前缀的命名方式。

时间一久,收集的视频数量很多,有时想从中提取一些视频文件来看,主要有以下几种提取想法:

  1. 提取一周内的文件
  2. 提取近两周内的文件
  3. 提取近一个月的文件
  4. 提取最近的30个文件
  5. 随机提取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. 给文件添加前时间前缀

下面的脚本是在这个博客文件重命名时快速添加时间前缀的基础上做了一些改进:

  1. 如果已经有了时间前缀,就不添加
  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

相关文章

网友评论

      本文标题:【实用脚本】用python实现按照时间前缀来提取文件

      本文链接:https://www.haomeiwen.com/subject/bjhrhhtx.html