Skip to main content

Utilities for parsing files in a directory based on a file name pattern.

Project description

Filepattern

Documentation Status PyPI PyPI - Downloads Bower

The filepattern utility is used to store files that follow a pattern, where the pattern is analogous to a simplified regular expression. The need for filepattern arises in situations where large amounts of data with a systematic naming convention needs to be filtered by patterns in the naming. For example, one may have a directory containing segmented images where the name contains information such as the channel, the column value, and the row value. filepattern provides the ability to extract all images containing such a naming pattern, filter by the row or column value, or group files by one or more of the aforementioned variables.

Summary

Install

filepattern is both pip and conda installable by running pip install filepattern or conda install filepattern -c conda-forge

Build and Install

Alternatively, filepattern can either be build inside a conda environment or independently outside of it directly from the source.

Inside Conda

filepattern uses a CMake build system. Below is an example of how to build filepattern Python package inside a conda environment on Linux.

git clone https://github.com/PolusAI/filepattern.git
cd filepattern
conda install -y -c conda-forge compilers --file ci-utils/envs/conda_cpp.txt --file ci-utils/envs/conda_py.txt
CMAKE_ARGS="-DCMAKE_PREFIX_PATH=$CONDA_PREFIX -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX " python -m pip install . -vv

Without Using Conda

To build filepattern outside of a conda environment, use the following example.

git clone https://github.com/PolusAI/filepattern.git
cd filepattern
mkdir build_dep
cd build_dep
bash ../ci-utils/install_prereq_linux.sh
cd ..
export FILEPATTERN_DEP_DIR=./build_dep/local_install
python -m pip install . -vv

C++ Library

filepattern also comes with a C++ API. To build and install filepattern as a C++ library, following the steps below.

git clone https://github.com/PolusAI/filepattern.git
cd filepattern
mkdir build
cd build
bash ../ci-utils/install_prereq_linux.sh
cmake -Dfilepattern_SHARED_LIB=ON -DCMAKE_PREFIX_PATH=./local_install -DCMAKE_INSTALL_PREFIX=./local_install ../src/filepattern/cpp/
make -j4
make install

To link filepattern with the client code, use the following CMake statements.

find_package(filepattern REQUIRED)
target_link_libraries(client_executable PRIVATE filepattern::filepattern)

Java API

filepattern also supplies a Java API. To add filepattern as a dependency to a project, the following can be added to the pom.xml of the maven project.

<dependencies>
    <dependency>
        <groupId>ai.polus.utils</groupId>
        <artifactId>filepattern</artifactId>
        <version>LATEST</version>
    </dependency>
</dependencies>

The Java API can also be built from source using Maven. To build the project, run

git clone https://github.com/PolusAI/filepattern.git
cd filepattern
mvn clean install

To build a jar instead of installing filepattern, mvn clean package can be used in place of mvn clean install.

For more information of the Java API, see the Java API documentation

Filepattern

When only a path to a directory and a pattern are supplied to the constructor of filepattern, filepattern will iterate over the directory, matching the filenames in the directory to the filepattern. The filepattern can either be supplied by the user or can be found using the infer_pattern method of filepattern. For example, consider a directory containing the following files,

img_r001_c001_DAPI.tif
img_r001_c001_TXREAD.tif
img_r001_c001_GFP.tif

In each of these filenames, there are three descriptors of the image: the row, the column, and the channel. To match these files, the pattern img_r{r:ddd}_c{c:ddd}_{channel:c+} can be used. In this pattern, the named groups are contained within the curly brackets, where the variable name is before the colon and the value is after the colon. For the value, the descriptors d and c are used, which represent a digit and a character, respectively. In the example pattern, three d's are used to capture three digits. The + after c denotes that one or more characters will be captured, which is equivalent to [a-zA-z]+ in a regular expression. The + symbol may be used after either d or c.

To have filepattern guess what the pattern is for a directory, the static method infer_pattern can be used:

import filepattern as fp

path = 'path/to/directory'

pattern = fp.infer_pattern(path)

print(pattern)

The result is:

img_r001_c001_{r:c+}.tif

Note that the infer_pattern can also guess the patterns from stitching vectors and text files when a path to a text file is passed, rather than a path to a directory.

To retrieve files from a directory that match the filepattern, an iterator is called on the FilePattern object, as shown below. A user specified custom pattern, such as the one below, or the guessed pattern can be passed to the constructor.

import filepattern as fp
import pprint

filepath = "path/to/directory"

pattern = "img_r{r:ddd}_c{c:ddd}_{channel:c+}.tif"

files = fp.FilePattern(filepath, pattern)

for file in files():
    pprint.pprint(file)

The output is:

({'c': 1, 'channel': 'DAPI', 'r': 1},
 ['path/to/directory/img_r001_c001_DAPI.tif'])
({'c': 1, 'channel': 'TXREAD', 'r': 1},
 ['path/to/directory/img_r001_c001_TXREAD.tif'])
({'c': 1, 'channel': 'GFP', 'r': 1},
 ['path/to/directory/img_r001_c001_GFP.tif'])

As shown in this example, the output is a tuple where the first member is a map between the group name supplied in the pattern and the value of the group for each file name. The second member of the tuple is a vector containing the path to the matched file. The second member is stored in a vector for the case where a directory is supplied with multiple subdirectories. In this case, a third optional parameter can be passed to the constructor. If the parameter recursive is set to True, a recursive directory iterator will be used, which iterates over all subdirectories. If the basename of two files from two different subdirectories match, filepattern will add the path of the file to the vector in the existing tuple rather than creating a new tuple.

For example, consider the directory with the structure

/root_directory
    /DAPI
        img_r001_c001.tif
    /GFP
        img_r001_c001.tif
    /TXREAD
        img_r001_c001.tif

In this case, the subdirectories are split by the channel. Recursive matching can be used as shown below.

import filepattern as fp
import pprint

filepath = "path/to/root/directory"

pattern = "img_r{r:ddd}_c{c:ddd}.tif"

files = fp.FilePattern(filepath, pattern, recursive=True)

for file in files():
    pprint.pprint(file)

The output of this case is:

({'c': 1, 'r': 1},
 ['path/to/root/directory/DAPI/img_r001_c001.tif',
  'path/to/root/directory/GFP/img_r001_c001.tif',
  'path/to/root/directory/TXREAD/img_r001_c001.tif'])

Floating Point Support

`filepattern` has the ability to capture floating point values in file patterns. For example, if we have a set of files
img_r0.05_c1.15.tif
img_r1.05_c2.25.tif
img_r2.05_c3.35.tif

We can capture the values in a couple of different ways. Similar to capturing digits, the character f can be used to capture an element of a floating point number. Note that with this method, the decimal point in the number must be captured by an f. For example, in the file img_r0.05_c1.15.tif, the floating point numbers would be capture with ffff. The code to utilize this method is

filepath = "path/to/directory"

pattern = "img_r{r:ffff}_c{c:ffff}.tif"

files = fp.FilePattern(filepath, pattern)

for file in files():
    pprint.pprint(file)

The result is:

({'c': 1.15, 'r': 0.05},
 ['path/to/directory/img_r0.05_c1.15.tif'])
({'c': 2.25, 'r': 1.05},
 ['path/to/directory/img_r1.05_c2.25.tif'])
({'c': 3.35, 'r': 2.05},
 ['path/to/directory/img_r2.05_c3.35.tif'])

To capture floating point numbers with an arbitrary number of digits, we can use f+. This method operates in the same way as using d+ or c+, where all digits (and the decimal point) will be captured for a floating point of any length. The code for this method is

filepath = "path/to/directory"

pattern = "img_r{r:f+}_c{c:f+}.tif"

files = fp.FilePattern(filepath, pattern)

for file in files():
    pprint.pprint(file)

The result of this code is the same as the previous example.

The final method for capturing floating points is to use d to capture the digits and to add the decimal point where needed. For example, in the file img_r0.05_c1.15.tif, the floating point numbers could be captured using d.dd. The code for this method is:

filepath = "path/to/directory"

pattern = "img_r{r:d.dd}_c{c:d.dd}.tif"

files = fp.FilePattern(filepath, pattern)

for file in files():
    pprint.pprint(file)

Once again, the results are the same as the first example.

Note that d can be used to specify even more specific floating points. For example, if we want to capturing all floating points with one digit in the whole part and an arbitrary number of digits in the decimal, we can add d.d+ for the pattern. Similarly, this could be used in a reverse manner to capture an arbitrary number of digits in the whole part using d+.ddd.

Group By

If images need to be processed in a specific order, for example by the row number, the group_by function is used. With the directory

img_r001_c001_DAPI.tif
img_r002_c001_DAPI.tif
img_r001_c001_TXREAD.tif
img_r002_c001_TXREAD.tif
img_r001_c001_GFP.tif
img_r002_c001_GFP.tif

the images can be returned in groups where r is held constant by passing the parameter group_by='r' to the object iterator.

import filepattern as fp
import pprint

filepath = "path/to/directory"

pattern = "img_r{r:ddd}_c{c:ddd}_{channel:c+}.tif"

files = fp.FilePattern(filepath, pattern)

for file in files(group_by='r'):
    pprint.pprint(file)

The output is:

('r': 1, [({'c': 1, 'channel': 'DAPI', 'file': 0, 'r': 1},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_DAPI.tif']),
 ({'c': 1, 'channel': 'TXREAD', 'file': 0, 'r': 1},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_TXREAD.tif']),
 ({'c': 1, 'channel': 'GFP', 'file': 0, 'r': 1},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_GFP.tif'])])
('r': 2, [({'c': 1, 'channel': 'DAPI', 'file': 0, 'r': 2},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r002_c001_DAPI.tif']),
 ({'c': 1, 'channel': 'GFP', 'file': 0, 'r': 2},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r002_c001_GFP.tif']),
 ({'c': 1, 'channel': 'TXREAD', 'file': 0, 'r': 2},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r002_c001_TXREAD.tif'])])

Note that the return of each call is a tuple where the first member is the group_by variable mapped to the current value and the second member is a list of files where the group_by variable matches the current value.

Get Matching

To get files where the variable matches a value, the get_matching method is used. For example, if only files from the TXREAD channel are needed, get_matching(channel=['TXREAD'] is called.

filepath = "/home/ec2-user/Dev/FilePattern/data/example"

pattern = "img_r{r:ddd}_c{c:ddd}_{channel:c+}.tif"

files = fp.FilePattern(filepath, pattern)

matching = files.get_matching(channel=['TXREAD'])

pprint.pprint(matching)

The output is:

[({'c': 1, 'channel': 'TXREAD', 'r': 1},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_TXREAD.tif']),
 ({'c': 1, 'channel': 'TXREAD', 'r': 2},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r002_c001_TXREAD.tif'])]

Text files

filepattern can also take in a text file as an input rather than a directory. To use this functionality, a path to a text file is supplied to the path variable rather than a directory. When a text file is passed as input, each line of the text file will be matched to the pattern. For example, a text file containing containing the strings

img_r001_c001_DAPI.tif
img_r001_c001_TXREAD.tif
img_r001_c001_GFP.tif

can be matched to the pattern img_r{r:ddd}_c{c:ddd}_{channel:c+}.tif with:

import filepattern as fp
import pprint

filepath = "path/to/file.txt"

pattern = "img_r{r:ddd}_c{c:ddd}_{channel:c+}.tif"

files = fp.FilePattern(filepath, pattern)

for file in files():
    pprint.pprint(file)

The output is:

({'c': 1, 'channel': 'DAPI', 'r': 1},
 ['img_r001_c001_DAPI.tif'])
({'c': 1, 'channel': 'TXREAD', 'r': 1},
 ['img_r001_c001_TXREAD.tif'])
({'c': 1, 'channel': 'GFP', 'r': 1},
 ['img_r001_c001_GFP.tif'])

After calling filepattern on a text file, the group_by and get_matching functionality can be used the same as outlined in the FilePattern section.

Stitching vectors

filepattern can also take in stitching vectors as input. In this case, a path to a text file containing a stitching vector is passed to the path variable. A stitching vector has the following form,

file: x01_y01_wx0_wy0_c1.ome.tif; corr: 0; position: (0, 0); grid: (0, 0);
file: x02_y01_wx0_wy0_c1.ome.tif; corr: 0; position: (3496, 0); grid: (3, 0);
file: x03_y01_wx0_wy0_c1.ome.tif; corr: 0; position: (6992, 0); grid: (6, 0);
file: x04_y01_wx0_wy0_c1.ome.tif; corr: 0; position: (10488, 0); grid: (9, 0);

This stitching vector can be processed using

import filepattern as fp

filepath = 'path/to/stitching/vector.txt'

pattern = 'x0{x:d}_y01_wx0_wy0_c1.ome.tif'

files = fp.FilePattern(filepath, pattern)

for file in files():
    pprint.pprint(files)

The output is:

({'correlation': 0, 'gridX': 0, 'gridY': 0, 'posX': 0, 'posY': 0, 'x': 1},
 ['x01_y01_wx0_wy0_c1.ome.tif'])
({'correlation': 0, 'gridX': 3, 'gridY': 0, 'posX': 3496, 'posY': 0, 'x': 2},
 ['x02_y01_wx0_wy0_c1.ome.tif'])
({'correlation': 0, 'gridX': 6, 'gridY': 0, 'posX': 6992, 'posY': 0, 'x': 3},
 ['x03_y01_wx0_wy0_c1.ome.tif'])
({'correlation': 0, 'gridX': 9, 'gridY': 0, 'posX': 10488, 'posY': 0, 'x': 4},
 ['x04_y01_wx0_wy0_c1.ome.tif'])

As shown in the output, filepattern not only captures the specified variables from the pattern, but also captures the variables supplied in the stitching vector.

Out of core

filepattern has the ability to use external memory when the dataset is too large to fit in main memory, i.e. it utilizes disk memory along with RAM. It has the same functionality as filepattern, however it takes in an addition parameter called block_size, which limits the amount of main memory used by filepattern. Consider a directory containing the files:

img_r001_c001_DAPI.tif
img_r001_c001_TXREAD.tif
img_r001_c001_GFP.tif

This directory can be processed with only one file in memory as:

import filepattern as fp
import pprint

filepath = "path/to/directory"

pattern = "img_r{r:ddd}_c{c:ddd}_{channel:c+}.tif"

files = fp.FilePattern(filepath, pattern, block_size="125 B")


for file in files():
    pprint.pprint(file)

The output from this example is:

({'c': 1, 'channel': 'DAPI', 'r': 1},
 ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_DAPI.tif'])
({'c': 1, 'channel': 'TXREAD', 'r': 1},
 ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_TXREAD.tif'])
({'c': 1, 'channel': 'GFP', 'r': 1},
 ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_GFP.tif'])

Note that the block_size argument is provided in bytes (B) in this example, but also has the options for kilobytes (KB), megabytes (MB), and gigabytes (GB). The block_size must be under 1000 GB.

Group by and get matching

The out of core version of filepattern contains the same functionalities as the in memory version. group_by is called the same way, i.e.,

for file in files(group_by="r"):
    pprint.pprint(file)

The output remains identical to the in memory version.

The get_matching functionality remains the same, however the API is slightly different. In this case, get_matching is called as

for matching in files.get_matching(channel=['TXREAD'])
    pprint.pprint(matching)

where the output is returned in blocks of block_size. The output is:

({'c': 1, 'channel': 'TXREAD', 'r': 1},
 ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_TXREAD.tif'])

Out of Core: text files and stitching vectors

Out of core processing can also be used for stitching vectors and text files. To utilize this functionality, call filepattern the same way as described previously, but add in the block_size parameter, as described in the (Out of Core)[#out-of-core] section.

Contributing

We welcome contributions to filepattern! Please see CONTRIBUTING.md for detailed guidelines.

Quick Start for Contributors

  1. Fork the repository
  2. Create a feature branch: git checkout -b feat/my-feature
  3. Make your changes following Conventional Commits
  4. Push to your fork and submit a pull request

Commit Message Format

We use Conventional Commits for automated releases:

  • feat: - New features (minor version bump)
  • fix: - Bug fixes (patch version bump)
  • docs: - Documentation changes
  • refactor: - Code refactoring
  • test: - Test additions or changes
  • chore: - Maintenance tasks

Example: feat: add support for nested directory patterns

For breaking changes, use feat!: or include BREAKING CHANGE: in the commit footer (major version bump).

Release Process

Releases are fully automated:

  1. Commits following conventional format are pushed to master
  2. Release Please creates/updates a Release PR with version bump and changelog
  3. When the Release PR is merged, a GitHub Release is created
  4. Automated workflows publish to PyPI and Maven Central

You don't need to manually update version numbers - the automation handles this based on your commit messages!

Authors

Jesse McKinzie(Jesse.McKinzie@axleinfo.com, jesse.mckinzie@nih.gov) Nick Schaub (nick.schaub@nih.gov, nick.schaub@labshare.org)

License

This project is licensed under the MIT License Creative Commons License - see the LICENSE file for details

Acknowledgments

  • This utility was inspired by the notation found in the MIST algorithm developed at NIST.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

filepattern-2.2.1.post0-cp313-cp313-win_amd64.whl (376.7 kB view details)

Uploaded CPython 3.13Windows x86-64

filepattern-2.2.1.post0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

filepattern-2.2.1.post0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

filepattern-2.2.1.post0-cp313-cp313-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

filepattern-2.2.1.post0-cp313-cp313-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13macOS 10.15+ x86-64

filepattern-2.2.1.post0-cp312-cp312-win_amd64.whl (376.7 kB view details)

Uploaded CPython 3.12Windows x86-64

filepattern-2.2.1.post0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

filepattern-2.2.1.post0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

filepattern-2.2.1.post0-cp312-cp312-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

filepattern-2.2.1.post0-cp312-cp312-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12macOS 10.15+ x86-64

filepattern-2.2.1.post0-cp311-cp311-win_amd64.whl (376.8 kB view details)

Uploaded CPython 3.11Windows x86-64

filepattern-2.2.1.post0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

filepattern-2.2.1.post0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

filepattern-2.2.1.post0-cp311-cp311-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

filepattern-2.2.1.post0-cp311-cp311-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11macOS 10.15+ x86-64

filepattern-2.2.1.post0-cp310-cp310-win_amd64.whl (375.7 kB view details)

Uploaded CPython 3.10Windows x86-64

filepattern-2.2.1.post0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

filepattern-2.2.1.post0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

filepattern-2.2.1.post0-cp310-cp310-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

filepattern-2.2.1.post0-cp310-cp310-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10macOS 10.15+ x86-64

File details

Details for the file filepattern-2.2.1.post0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 6dc022ba3a1f689ac40ead5dd31ef2a15004d8315b890d0bf6eaeff01bff99ca
MD5 e1c56ba081d34187a4bc346597e11507
BLAKE2b-256 69302d1a41cbd49a97e20e522d9e1b72a38575520c047d8032c5340fc0e4456a

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 52ad9aaa8a5a40669f8a566b4f1e2794dd0fefe54fda2baafb4bb0dd9f3babc5
MD5 984de211846317bddfd2423ad2b3aad0
BLAKE2b-256 38d094b7422ecfbe3e318b632a170d15730adfa7c65301aebcb594f6b04a800a

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 cd697efd2ec9fd1ec6a59405ee6fe93a9aca822aca5e7ad1d8cd04d5daae6bf4
MD5 fa6d277ae071c8ef23a8842f51790752
BLAKE2b-256 dbd5e14c289b113ab3085f64a1516b43aec7492c0d944aae34c4b242499ac7fe

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8650519d72e97b01306fe1afbc0dd69853b14c383a6535597e6372dfc246df2a
MD5 3e5e7cc6f24ecd160a9a84ef10265086
BLAKE2b-256 5c4edd6362b9671dd4a0be0d207c7db204b41c89aba285d757c8e022fc9beb83

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp313-cp313-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp313-cp313-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 6b47fa2b7ef0f12a377b798d55d75f29eeeee7abeb9ab6e88c64cef1d1fc02a1
MD5 3698fa6bf2a2977902f1c7979e2e837f
BLAKE2b-256 37511695844377f117c56be179f25a585cf04c6778e48eafa3fe754af8042de2

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 5d615b9026c72e69dcbcca2364a722ffe78389e3f899d24e6eb7f64f8e71cdf1
MD5 3d4c7f2fa9c23733d61bd208242c432f
BLAKE2b-256 145429ac60121982d53111c5b8cb302a2559f8258ae24a286d5ab9f4d7a9334c

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9dc23525a89d4411bcb7ec9413866716a7f36c6430cbe51c9c4e4f8e7b6b5f91
MD5 9254cde974ed95162763a53ff7f0e058
BLAKE2b-256 e965f31be2889995a1a5a982bd7c6251ce19c96db76ed9b9167b3fa671e6c8b8

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 d86ab71a623b9304f5b70bc2afe0ba9a63ccf58c853c9999f67b73bdab8a895b
MD5 cfad8b70df86568a9d2801d46f608479
BLAKE2b-256 c79650027ab65498dfb4447afdb6ab7ff07fef126efd2c4bdb01d17fceaad2fd

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 89095e3747891a6c95d41284e5aaeaff8b462094e9c0eae370e2dd5ffe244671
MD5 a0c96037f0257f9561b1de2b9ddd0d81
BLAKE2b-256 952bdf846c5d64ae90ba176f315a8fa00589e993d9d0942bded727d48f4259a0

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 49fc8f2c48a128b2e93b201efeaad20d2b869d05e17e9f4f4199ab0717f5d5f6
MD5 86df5d89b5885d7d697e917270d97de7
BLAKE2b-256 9da620e934facb934b0d20e267fb456089cfd4c1191a9b8770464bf281ecc5bc

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d2e5e6f112d0390828e195b39d9377a275e877c82695a85e6bb8fcc69764741b
MD5 c5c26a4f5905f9b7674725f2750fb437
BLAKE2b-256 62c51d33ad99a556cd8f1119d1d48d5ca4ae6b05244f7e5032fe1cdccde042df

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 46dab36b4d18c8491b18f575734e262a3faa2983ef63dd48df17b2702985b29a
MD5 b11a8399d1ce1f8f9ca8296fd88fd997
BLAKE2b-256 9ac6fc3e63af0140d3f2d359e12c6a7bfa171eed7904fdb3cbd5ed400c0c4004

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 2dcad7edda7658b6c53cb2691dd22dde7613055aae9672b6679ec7a3faea82a3
MD5 3731f197b7ad25afcebf37bfcce53420
BLAKE2b-256 0521316aaac538c382dc64981643ca48b3931f624819f4bf3837ae4152d4fb7b

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 81ade050e247a0eb295ab603bb339376c79dae8bd973f8e38a0513547567518e
MD5 fe2756d85bf328480235c7d3945c5ab9
BLAKE2b-256 632617d6b56447c61185990b10a2dd8a32bb1b9fc4da01bc5efaef23d243b931

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 feb1c67efb93fdf31f8e32413dd82f2734f312eecffc182c8c775adf09043ce2
MD5 a850d3f3cd62c299113e01e423ac6d25
BLAKE2b-256 596bad6fe4859ccb354e10f5bfbc95062aedbc17c1401270352ea1079ac362d4

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f1b39e91149522e9f6ff3d1e8ac7d4c59aebc8db3f3e3ab84bb0f082b5093a57
MD5 861531512cb475b1ae175d016fed2dda
BLAKE2b-256 405869adedc528c572fe6cf96603d92b2cbccf885be97f2b0fb4f9ff32009e65

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5db24a4d7d94c43edfc069d9e2c5e9f5eeb7840912c84ec92e8ae66a9952c9bf
MD5 71b99112512a842cc8f5c40774d7e443
BLAKE2b-256 b842849e4abf84664222d0e6e52b663959e9e9442736211acb08502e413bf56a

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 e8cb9b64b042aac33f9526194d523463e4ac636ed840f40cb77978fd186fad9d
MD5 446ee5e9d942bdf5a4434a64b98789b3
BLAKE2b-256 9ee223f90e775f6abd8b80a27c0328f5c645fec7a701f6e8ba0746db9b0b40f6

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 030e22476bc0f822cedecfa6de29c9bc979a695c0666ea77c6d1c145a935a6c4
MD5 b833389a00bbc061c6d10e543b3fbeaa
BLAKE2b-256 811fce34d25a585187c1c0fcd10cf9b77fbdc0b677b769527f68d61f068e118d

See more details on using hashes here.

File details

Details for the file filepattern-2.2.1.post0-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.1.post0-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 050712541a4a21a18473adf41ce722066d2dd96ffe1b466de2f2d6bf1ac5086e
MD5 56391042ccd55ab444ba97c363b52419
BLAKE2b-256 d5f8bce7a3eb773feb5a271088606c821a97adcdd51132546a51801a21a0f93c

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