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.

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

filepattern-2.1.2-cp313-cp313-win_amd64.whl (302.9 kB view details)

Uploaded CPython 3.13 Windows x86-64

filepattern-2.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

filepattern-2.1.2-cp313-cp313-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

filepattern-2.1.2-cp313-cp313-macosx_10_15_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13 macOS 10.15+ x86-64

filepattern-2.1.2-cp312-cp312-win_amd64.whl (302.9 kB view details)

Uploaded CPython 3.12 Windows x86-64

filepattern-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

filepattern-2.1.2-cp312-cp312-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

filepattern-2.1.2-cp312-cp312-macosx_10_15_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12 macOS 10.15+ x86-64

filepattern-2.1.2-cp311-cp311-win_amd64.whl (303.2 kB view details)

Uploaded CPython 3.11 Windows x86-64

filepattern-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

filepattern-2.1.2-cp311-cp311-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

filepattern-2.1.2-cp311-cp311-macosx_10_15_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11 macOS 10.15+ x86-64

filepattern-2.1.2-cp310-cp310-win_amd64.whl (302.0 kB view details)

Uploaded CPython 3.10 Windows x86-64

filepattern-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

filepattern-2.1.2-cp310-cp310-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

filepattern-2.1.2-cp310-cp310-macosx_10_15_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

filepattern-2.1.2-cp39-cp39-win_amd64.whl (300.2 kB view details)

Uploaded CPython 3.9 Windows x86-64

filepattern-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

filepattern-2.1.2-cp39-cp39-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

filepattern-2.1.2-cp39-cp39-macosx_10_15_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

filepattern-2.1.2-cp38-cp38-win_amd64.whl (301.9 kB view details)

Uploaded CPython 3.8 Windows x86-64

filepattern-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

filepattern-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

File details

Details for the file filepattern-2.1.2-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ff0fb68dd1796e127cad3bf90532b30911b0165aff86da5987eee0b192729a4b
MD5 a38f69fbe9f8edf83170a81a12e5bd3d
BLAKE2b-256 54e156c8e4ebeef4b163befbfb9ec143ba19e13a88d193283b2a8946bb7374fd

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dfaddfc688ee08581dbe987b14e4aeb36d760c443b48e5bc1910b1e64b739346
MD5 f6af38dd5be002e982d5a90b1d31a0f6
BLAKE2b-256 1a62a3da298fe74fe593f869f71922f0599f882ccd8d07483505c4af9e8f00a1

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2643eb1b6817b6b15d0320c32161ce3bc90383038fff2e8a7f99d729f246431e
MD5 5cb1133ff3b2a12ca44bcba356e258e7
BLAKE2b-256 4746d66db4fb1b077876fc9395b2decd15c1125b15d01a70f43cc7334d6d894e

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp313-cp313-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp313-cp313-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 83e78d278ad8211db8e426ffe90cda0f9c3a0df71ed70df223aa3248adc21b9b
MD5 2782c15601b67433c5e1cc69c8263143
BLAKE2b-256 2ec1e87d8c5a848b40c294f3797d44d751293ee94ad058aac13ef5a888a058ed

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1d35796b88638417e3b44bbbe21d9b7c632b22ff6711d6066d6bf16873735814
MD5 fdb1a340733597513313b772cfc99d20
BLAKE2b-256 0fe6158b94c446a2abe12d840aefa19cc847a0d015328a4ee8be0c5d9b58cd54

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b6de9a0cc632ade89cbd744dcac1305430b6b440ddff0cdaea857a6929d091a9
MD5 15fa9ce9d894058c0e640ea86cf12870
BLAKE2b-256 b4338fa0d1cb08d7da3f761d80825af94e3db77410981cf5d48c5a210f9201f1

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 10f73ed1a43217ef113838ae8d64093911af33ee963f7458578fdf574da64795
MD5 6fccc99216b016cb21463caba6b7bdf5
BLAKE2b-256 3247afcc9ec24df155dbc5a9e6cab1f07d0eec2a128e2f63ff82232248a64f16

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 bd60be4a3577684f4d46276928909f55f2ed529cbe8de863256b40ae405680b0
MD5 e05790cf502caa1ec35129cef24ef2b2
BLAKE2b-256 399ac95efa39b9c615d4ef5cbd756ae2d9c658407bef55ee29f6787a354d0f4d

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 31ab8605b468b60b8ef5df75cd019cd389b90d34b64b4910cb6ab5c6e6f49268
MD5 d0f74a977981f590c6c6f54b4489784e
BLAKE2b-256 d9de4213aa2f907f9cfc34355af803b53d90eec0ee0be9ee86790bb354d919a6

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 25508409b5f1cc1b80c6bd798472eeb15cfc3e23715e79dbceea92a7d3f14f0b
MD5 3d4e5e13090cc1c32e1a0abdf26a3ac0
BLAKE2b-256 da6c3d185d079dbc5e4df107de8d6bb91706fc4f089fdc1ddef3698c573318c7

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e094d81cb3af0cd12216c82add4290c3dff47bb93a82410c647efa43723d1e37
MD5 e6b9ed30730dee038922adc891fa8b5e
BLAKE2b-256 17d60f8729b941a0166b9f800307ac04126d7e2d0816d320879e889c0ddd4b1d

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 e90e50b124195c238206df7a6b98bfaca37dc34ae269d9db2187a68736d6e6e9
MD5 331d93a0a01960f40febf7f2806e4755
BLAKE2b-256 67cddea6d97fe639a7c2303c6bc715eed7a1000f0ea9d8096e142c1ddc0eabeb

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 5a88d131f102365895db0f7e699c66d627903aa8b90eaf80e8f5e09987390ace
MD5 2b19fa71c31b843cdaad5aec8d71520d
BLAKE2b-256 1a101142e027349fde7c0061e9f8d48dffecb42aa680a0fa342c8fe65832431f

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ab5968bff893d63f275d4ff8b03c48df0567905b45bdad8301dec01cf7258fa2
MD5 f1a02f5b76eea0d127784f1e4197c42e
BLAKE2b-256 0b68c08731194452c110ff3beef0e653919f140671b4a0a1ba62c62423df995c

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5b1384c4c8c3b683ab2889fa186b19d16eba9e2dd667f93bf0771a21964a78c3
MD5 599c975a59b27520925b6de86cbc6d0b
BLAKE2b-256 883b42b0bacec5c8689a408da5b414e1ac5ef083b911abcf895ea948bfd388c5

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 a916b074630fe8330c8930af37d00a209615c353102c492b2f760dd033c4205d
MD5 46ea9ff406fa56feba3c31fbe9aff994
BLAKE2b-256 087cb07b253c62f3a0f9fd6be89c735203b963e6b7e1c84151d63156527e64c4

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 e2e0670c4e7d67004ea3092de2021aa0d9b5cdc7d3639d0ed5bda060b789137f
MD5 f65e6d8515bf077cfd4904e333dc88ab
BLAKE2b-256 0d0fb1a738293b4de56f223113da549b9c09e3a45c4d091c952bddd5defd0716

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5a171687622f3008717f54308deff3734f3825d2eac4eee9a0e9041a49f38cab
MD5 ff08fc77537d2b92d071a6d728526d2f
BLAKE2b-256 5c44d2d293857071155fec6efcb3b543433dba74fd6f0bd73623fdb657653476

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6967dff4eb0b81fb89de20353cd253bc2e3121ca84dd0b7d701079e1b6690799
MD5 43a1204fd1e9bdf211c44e5d1e83b62a
BLAKE2b-256 cb1c53e7b629d4a1ca8ae51ccb4141aecfbdf7102320080d682988732ce078ef

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 605c91122d0d604eed50b755fc93cb12f19f4790a0d7697630a9acdfaaeb7032
MD5 518f862044d115399ef59225eaadb3f4
BLAKE2b-256 1a8eb47c4987cebe7326b1f0b170512d4367c7f67883231a3e4bb0d601cd81fa

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 7a5cadfb3cfd2db5e64bc9d685e6d81387a3abfbf027f21cde75b0494174714d
MD5 23d9f3452b9dfa7ab69b319c39cbc4e5
BLAKE2b-256 13f0b07e17297661c352d14e7d846b52886294ca2fa357741c146efadbd8c7ee

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b859ab2790c034db5b39f3f9fb4d54c3d24918fd8129893191d1745c92bec1e4
MD5 6570c03d687c44077fa397d0a70acd40
BLAKE2b-256 f0319e2d19890e5f532208e422b1a0cb9643ae9e2eee3c6d1a3db6e8e4efcc04

See more details on using hashes here.

File details

Details for the file filepattern-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 ea5a96bc03a5b3c27ee60bae9d35faa2832d221665de3e5fe5fa8339d6256937
MD5 27ebe4d66853ee6883cf7bef0f0027cd
BLAKE2b-256 54d5de8ff56552bed3d3f48c0d9943806b64b956c74bc499eef3b3e3d53b5a4a

See more details on using hashes here.

Supported by

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