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/