Skip to main content

Compressed File Sequence String Module

Project description

PySeq

PySeq is a python module that finds groups of items that follow a naming convention containing a numerical sequence index (e.g. fileA.001.png, fileA.002.png, fileA.003.png...) and serializes them into a compressed sequence string representing the entire sequence (e.g. fileA.1-3.png). It should work regardless of where the numerical sequence index is embedded in the name. For examples, see basic usage below or http://rsgalloway.github.io/pyseq

Installation | Basic Usage | API Examples | Formatting | Command-Line Tools | Frame Patterns | Testing

Installation

The easiest way to install pyseq:

$ pip install -U pyseq

Environment

PySeq reads configuration from standard environment variables. The repository includes a pyseq.env example envstack file for users who want to manage those variables externally.

Distribution

If installing from source you can use distman to install PySeq using the provided dist.json file:

$ pip install -U distman
$ distman [-d]

Using distman will deploy the targets defined in the dist.json file to the root folder defined by ${DEPLOY_ROOT}:

Basic Usage

Using the "z1" file sequence example in the "tests" directory, we start by listing the directory contents using ls:

$ ls tests/files/z1*
tests/files/z1_001_v1.1.png  tests/files/z1_001_v1.4.png  tests/files/z1_002_v1.3.png   tests/files/z1_002_v2.11.png
tests/files/z1_001_v1.2.png  tests/files/z1_002_v1.1.png  tests/files/z1_002_v1.4.png   tests/files/z1_002_v2.12.png
tests/files/z1_001_v1.3.png  tests/files/z1_002_v1.2.png  tests/files/z1_002_v2.10.png  tests/files/z1_002_v2.9.png

Now we list the same directory contents using lss, which will find the sequences and display them in the default compressed format:

$ lss tests/files/z1*
   4 z1_001_v1.%d.png [1-4]
   4 z1_002_v1.%d.png [1-4]
   4 z1_002_v2.%d.png [9-12]

Recursivly walk a folder and find all the sequences:

$ lss -r tests
tests
├── test_pyseq.py
└── files
    ├── 012_vb_110_v001.1-10.png
    ├── 012_vb_110_v002.1-10.png
    ├── a.1-14.tga
    ├── alpha.txt
    ├── bnc01_TinkSO_tx_0_ty_0.101-105.tif
    ├── bnc01_TinkSO_tx_0_ty_1.101-105.tif
    ├── bnc01_TinkSO_tx_1_ty_0.101-105.tif
    ├── bnc01_TinkSO_tx_1_ty_1.101-105.tif
    ├── file.1-99.tif
    ├── file.info.03.rgb
    ├── file01.1-4.j2k
    ├── file01_40-43.rgb
    ├── file02_44-47.rgb
    ├── file1-4.03.rgb
    ├── fileA.1-3.jpg
    ├── fileA.1-3.png
    ├── file_02.tif
    ├── z1_001_v1.1-4.png
    ├── z1_002_v1.1-4.png
    └── z1_002_v2.9-12.png

Piping the output of find to lss, for example finding all the png sequences:

$ find ./tests/ -name *.png | lss
  10 012_vb_110_v001.%04d.png [1-10]
  10 012_vb_110_v002.%04d.png [1-10]
   3 fileA.%04d.png [1-3]
   4 z1_001_v1.%d.png [1-4]
   4 z1_002_v1.%d.png [1-4]
   4 z1_002_v2.%d.png [9-12]

Use the --format option to retain the relative path:

$ find tests/ -name "*.png" | lss -f "%D%h%r%t"
tests/files/012_vb_110_v001.1-10.png
tests/files/012_vb_110_v002.1-10.png
tests/files/fileA.1-3.png
tests/files/z1_001_v1.1-4.png
tests/files/z1_002_v1.1-4.png
tests/files/z1_002_v2.9-12.png

API Examples

Compression, or serialization, of lists of items:

>>> s = Sequence(['file.0001.jpg', 'file.0002.jpg', 'file.0003.jpg'])
>>> print(s)
file.1-3.jpg
>>> s.append('file.0006.jpg')
>>> print(s.format("%h%p%t %R"))
file.%04d.jpg [1-3, 6]

Uncompression, or deserialization, of compressed sequences strings:

>>> s = uncompress('./tests/012_vb_110_v001.%04d.png 1-1001', fmt='%h%p%t %r')
>>> len(s)
1001
>>> print(s.format('%04l %h%p%t %R'))
1001 012_vb_110_v001.%04d.png [1-1001]

Walk a directory tree and print disk usage for file sequences:

>>> for root, dirs, seqs in pyseq.walk(folder):
...     for seq in seqs:
...         print(seq.format("%h%r%t %H"))
012_vb_110_v001.1000-1321.exr   123.5G
012_vb_110_v002.1000-1163.exr    40.2G
012_vb_110_v003.1000-1027.exr    72.2G

Formatting

The following directives can be embedded in the format string.

Directive Meaning
%s sequence start
%e sequence end
%l sequence length
%f list of found files
%m list of missing files
%M explicit missing files [11-14,19-21]
%p padding, e.g. %06d
%r implied range, start-end
%R explicit broken range, [1-10, 15-20]
%d disk usage
%H disk usage (human readable)
%D parent directory
%h string preceding sequence number
%t string after the sequence number

Here are some examples using lss -f <format> and seq.format(..):

Using lss -f <format>:

$ lss tests/files/a*.tga -f "%h%r%t"
a.1-14.tga
$ lss tests/files/a*.tga -f "%l %h%r%t"
7 a.1-14.tga
$ lss tests/files/a*.tga -f "%l %h%r%t %M"
7 a.1-14.tga [4-9, 11]

In Python, using seq.format(..):

>>> s = pyseq.get_sequences("tests/files/a*.tga")[0]
>>> print(s.format("%h%r%t"))
a.1-14.tga
>>> print(s.format("%l %h%r%t"))
7 a.1-14.tga
>>> print(s.format("%l %h%r%t %M"))
7 a.1-14.tga [4-9, 11]

Command-Line Tools

PySeq comes with the following sequence-aware command-line tools:

Command Description Example Usage
lss List image sequences in a directory lss shots/
stree Display sequence-aware directory tree stree shots/
sfind Recursively find image sequences sfind assets/ -name "*.exr"
sdiff Compare two sequences sdiff A.%04d.exr B.%04d.exr
sstat Print detailed stats about a sequence sstat render.%04d.exr
scopy Copy a sequence to another directory scopy a.%04d.exr /tmp/output/
srm Remove a sequence or frame range srm a.1001-1100.exr
smv Move or rename a sequence smv b.%04d.exr /tmp/archive/

Example commands:

# List sequences in a folder
$ lss tests/files

# Show directory structure with grouped sequences
$ stree tests/

# Find all .png sequences recursively
$ sfind ./tests -name "*.png"

# Compare two sequences and print diffs
$ sdiff comp_A.%04d.exr comp_B.%04d.exr

# Show stats for a sequence
$ sstat render.%04d.exr
$ sstat --json render.%04d.exr

# Copy a sequence into a directory
$ scopy input.%04d.exr output/

# Copy an embedded frame range into a new sequence
$ scopy input.1-100.exr scene.1001-1100.exr

# Remove an embedded frame range
$ srm input.1-100.exr

# Rename a sequence in place
$ smv old.%04d.exr new.%04d.exr

# Move an embedded frame range into a new sequence
$ smv old.1-100.rgb new.1001-1100.rgb

# Move and renumber a sequence starting at frame 1001
$ smv old.%04d.exr archive/ --renumber 1001

Frame Patterns

The environment var ${PYSEQ_FRAME_PATTERN} can be used to define custom regex patterns for identifying frame numbers. For example if frames are always preceded with an _, you might use:

$ export PYSEQ_FRAME_PATTERN="_\d+"

Environment vars can be defined anywhere in your environment, or if using envstack, add them to pyseq.env and make sure that file is found in ${ENVPATH}:

$ export ENVPATH=/path/to/env/files

Examples of regex patterns can be found in the pyseq.env file:

# matches all numbers, the most flexible
PYSEQ_FRAME_PATTERN: \d+

# excludes version numbers, e.g. file_v001.1001.exr
PYSEQ_FRAME_PATTERN: ([^v\d])\d+

# frame numbers are dot-delimited, e.g. file.v1.1001.exr
PYSEQ_FRAME_PATTERN: \.\d+\.

# frame numbers start with an underscore, e.g. file_v1_1001.exr
PYSEQ_FRAME_PATTERN: _\d+

Testing

To run the unit tests, simply run pytest in a shell:

$ pytest tests -q

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyseq-0.9.2.tar.gz (41.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyseq-0.9.2-py3-none-any.whl (39.8 kB view details)

Uploaded Python 3

File details

Details for the file pyseq-0.9.2.tar.gz.

File metadata

  • Download URL: pyseq-0.9.2.tar.gz
  • Upload date:
  • Size: 41.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/75.3.4 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.8.10

File hashes

Hashes for pyseq-0.9.2.tar.gz
Algorithm Hash digest
SHA256 145b0b8525cfa797f95d5aedb573c25fea849e356508d9312ad1f64ac3fab543
MD5 27405860107cfcb18b85dceb43827639
BLAKE2b-256 7df7c4b6a3a6bc6ca0487c6c93d15b302970faa7c38ea44bbf01aa8578be826b

See more details on using hashes here.

File details

Details for the file pyseq-0.9.2-py3-none-any.whl.

File metadata

  • Download URL: pyseq-0.9.2-py3-none-any.whl
  • Upload date:
  • Size: 39.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/75.3.4 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.8.10

File hashes

Hashes for pyseq-0.9.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f7c6014ec5c776b0539e9414878ec3928edc2c4d13628a93748a114f380dc971
MD5 19d5e6d5717192bcd7d9024e84348f7f
BLAKE2b-256 49e333ce228751ecf1f61b74ba29abb03769291669fe405247e965ae521f5bc0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page