Source code for cgl.core.list_dir

# This is a sample Python script.
import logging
import os
import random
import re


[docs] def remove_elements(input_list, n): """ removes n random items from a list Args: input_list: n: how many random items to remove Returns: list with n random items removed """ to_delete = set(random.sample(range(len(input_list)), n)) return [x for i, x in enumerate(input_list) if not i in to_delete]
[docs] def generate_sequence(sframe, eframe, remove_frames=0, padding=4): """ generates a sequence of files from a start frame to an end frame """ current_frame = sframe sequence = [] while current_frame <= eframe: frame_string = format(current_frame, get_padding_string(padding)) filestring = "test_file.{}.txt".format(frame_string) sequence.append(filestring) current_frame += 1 if remove_frames: sequence = remove_elements(sequence, remove_frames) return sequence
[docs] def get_frame_numbers(file_list): padding = 4 numbers = [] regex = re.compile(r"\.[0-9]{4}\.") for s in file_list: f_, file = os.path.split(s) frame_num = re.search(regex, file) if frame_num: text_num = frame_num.group(0).replace(".", "") padding = len(text_num) numbers.append(int(text_num)) return sorted(numbers), padding
[docs] def get_file_numbers(number_list, padding): """ formats a list of numbers as a sequence: 1-1000 1-10, 14-33, 44, 66-100 Args: number_list: Returns: """ padding_string = get_padding_string(padding) try: sframe = number_list[0] eframe = number_list[-1] except IndexError: return None missing = find_missing(number_list, padding) if missing: return missing else: return "{}-{}".format( format(sframe, padding_string), format(eframe, padding_string) )
[docs] def get_padding_string(padding): if padding < 9: padding_string = "0{}".format(padding) else: padding_string = str(padding) return padding_string
[docs] def find_missing(sequence, padding): """ finds missing numbers in a number sequence and formats a sequence the way nuke does it. Args: sequence: Returns: """ padding_string = get_padding_string(padding) sframe = sequence[0] eframe = sequence[-1] missing = sorted(set(range(sframe, eframe)) - set(sequence)) bframe = None sequence_string = "" for m in missing: if not bframe: bframe = sframe bstring = format(bframe, padding_string) mini_seq_start = bstring mini_seq_end = format(m - 1, padding_string) if mini_seq_end == mini_seq_start: frange = "{}".format(bstring) else: if int(bstring) < (m - 1): frange = "{}-{}".format(bstring, format(m - 1, padding_string)) else: bframe = m + 1 continue if not sequence_string: sequence_string = frange else: sequence_string = "{}, {}".format(sequence_string, frange) bframe = m + 1 if bframe: end_range = "{}-{}".format( format(bframe, padding_string), format(eframe, padding_string) ) else: return "{}-{}".format( format(sframe, padding_string), format(eframe, padding_string) ) if end_range: return "{}, {}".format(sequence_string, end_range)
[docs] def get_frame_range(file_list): frame_numbers, pad = get_frame_numbers(file_list) nums = get_file_numbers(frame_numbers, padding=pad) return nums
[docs] def list_dir(dir): """ lists all files in a directory Args: dir: """ file_list = os.listdir(dir)
# Press the green button in the gutter to run the script. if __name__ == "__main__": source_sequence = r"C:\CGLUMBERJACK\COMPANIES\premise\render\AlchemyTestB\master\shots\000\0000\rfs\default\tmiko\000.000\1920x1080" file_list = generate_sequence(sframe=1, eframe=100, remove_frames=4, padding=3) logging.info(file_list) get_frame_range(file_list) # See PyCharm help at https://www.jetbrains.com/help/pycharm/