def testIter(self): known = set([ "/cheech/chong.0001.exr", "/cheech/chong.0003.exr", "/cheech/chong.0005.exr" ]) seq = fileseq.FileSequence("/cheech/chong.1,3,5#.exr") self.assertFalse(known.difference(seq))
def testFormat(self): seq = fileseq.FileSequence("/cheech/chong.1-10,30,40#.exr") self.assertEquals("chong.0001-0010,0030,0040#.exr", str(seq.format())) self.assertEquals("0011-0029,0031-0039", seq.format("{inverted}")) seq = fileseq.findSequencesOnDisk("broken_seq")[0] self.assertEquals("0000-0002,0004,0006-0008", seq.format("{range}")) self.assertEquals("broke.0000-0002,0004,0006-0008#.exr", seq.format()) seq = fileseq.findSequencesOnDisk("step_seq")[0] self.assertEquals("step_seq/step1.1-13x4,14-17#.exr", str(seq))
def testSeqGettersType2(self): seq = fileseq.FileSequence("/foo/boo1-5#.exr") self.assertEquals(5, len(seq)) self.assertEquals("/foo/", seq.dirname()) self.assertEquals("boo", seq.basename()) self.assertEquals("#", seq.padding()) self.assertEquals(".exr", seq.extension()) self.assertEquals("/foo/boo9999.exr", seq.frame(9999)) self.assertEquals("/foo/boo0001.exr", seq[0]) self.assertEquals("/foo/boo0001.exr", seq.index(0))
def move_file_sequence(source, destination): """ Moves a sequence of files from source to destination Args: source (str): Sequence filepath, eg, /path/to/file.####.png destination (str): Destination, using a single # for frames, eg, /path/to/renamed.#.png """ src_sequence = fileseq.findSequenceOnDisk(source) dst_sequence = fileseq.FileSequence(destination.replace("#", "1-1#")) dst_sequence.setFrameSet(src_sequence.frameSet()) for src_frame, dst_frame in zip(src_sequence, dst_sequence): shutil.move(src_frame, dst_frame)
def testNoPlaceholder(self): expected = "/path/to/file.mov" seqs = fileseq.FileSequence(expected) self.assertEquals(expected, seqs.index(0)) self.assertEquals(expected, seqs.frame(0)) self.assertEquals(expected, seqs[0]) self.assertEquals(None, seqs.frameSet()) self.assertEquals("", seqs.frameRange()) self.assertEquals("", seqs.invertedFrameRange()) self.assertEquals(1, len(seqs)) seqs.setFrameRange("1-100") for i in xrange(0, 100): self.assertEquals(expected, seqs.index(i)) self.assertEquals(expected, seqs.frame(i + 1)) self.assertEquals(expected, seqs[i]) self.assertEquals(1, len(seqs)) seqs.setPadding("#") self.assertEquals(100, len(seqs))
# The easiest way to get third party code is to find a python "package" (which is # another term for a folder of modules) that is on pypi, the python package index: # https://pypi.org/ # This is a communal resource for verified code that will work with python, and is # really easy to install! Python comes with a builtin tool called "pip", short for # "Package Installer for Python". You can run this on the command line to automatically # find packages from pypi and install them for you. # To demonstrate, you can run the following command to install Fileseq, a common vfx # package for handling file sequences # pip install Fileseq # Fileseq documentation: # https://fileseq.readthedocs.io/en/latest/ import fileseq sequence = fileseq.FileSequence("/fake/file/sequence.5-100#.png") sequence.frameRange() # '5-100' sequence.frame(32) # '/fake/file/sequence.0032.png' sequence.start() # 5 sequence.basename() # 'sequence.' sequence.dirname() # '/fake/file' for filepath in sequence: print(filepath) # Installing third party modules using pip will install them in a location relative to # the current python interpreter (ie, the executable for the version of python you're # currently running). It's important to make sure you install to the right version of # python, otherwise the package won't be available to the other ones. If you want to be # explicit about which version you install to, you can call pip from the python # executable using the "-m" flag like so:
def testSerialization(self): fs = fileseq.FileSequence("/path/to/file.1-100x2#.exr") s = cPickle.dumps(fs, cPickle.HIGHEST_PROTOCOL) fs2 = cPickle.loads(s) self.assertEquals(str(fs), str(fs2)) self.assertEquals(len(fs), len(fs2))
def testSplitXY(self): seqs = fileseq.FileSequence("/cheech/0-9x1/chong.1-10#.exr") self.assertEquals("/cheech/0-9x1/chong.0001.exr", seqs.index(0))
def testNumericFilename(self): seqs = fileseq.FileSequence("/path/to/1-10#.exr") self.assertEquals("/path/to/0001.exr", seqs.index(0))
def testMissingPeriods(self): seqs = fileseq.FileSequence("/path/to/something_1-10#_exr") self.assertEquals("/path/to/something_0001_exr", seqs.index(0))
def testSplit(self): seqs = fileseq.FileSequence("/cheech/chong.1-10,30,40#.exr").split() self.assertEquals("/cheech/chong.0001-0010#.exr", str(seqs[0])) self.assertEquals("/cheech/chong.0030#.exr", str(seqs[1])) self.assertEquals("/cheech/chong.0040#.exr", str(seqs[2]))
def testFrame(self): seq = fileseq.FileSequence("/foo/bar/bing.#.exr") self.assertEquals("/foo/bar/bing.0001.exr", seq.frame(1)) self.assertEquals("/foo/bar/bing.#.exr", seq.frame("#"))
def testSetFrameRange(self): seq = fileseq.FileSequence("/cheech/chong.1-5#.exr") seq.setFrameRange("10-20") self.assertEquals("/cheech/chong.10-20#.exr", str(seq))
def testSetPadding(self): seq = fileseq.FileSequence("/foo/[email protected]") seq.setPadding("#") self.assertEquals("/foo/bong.0001.exr", seq[0])
def testSetBasename(self): seq = fileseq.FileSequence("/foo/[email protected]") seq.setBasename("bar.") self.assertEquals("/foo/bar.1.exr", seq[0])
def testSetDirname(self): seq = fileseq.FileSequence("/foo/[email protected]") seq.setDirname("/bing/") self.assertEquals("/bing/bong.1.exr", seq[0])