Skip to main content

Extended XYZ file format tools

Project description

Extended XYZ specification and parsing tools

This repository contains a specification of the extended XYZ (extxyz) file format, and tools for reading and writing to it from programs written in C, Fortran, Python and Julia.

Using ASE? As of v0.3.0, extxyz is the standalone C parser with no ASE dependency, and a separate ase-extxyz package registers it as an ASE I/O plugin. Install both with pip install ase-extxyz and use ase.io.read("file.xyz", format="cextxyz").

Installation

Python

The latest development version can be installed via

pip install git+https://github.com/libAtoms/extxyz

This requires Python 3.10+ and a working C compiler, plus the PCRE2 and libcleri libraries. libcleri is included here as a submodule and will be compiled automatically, but you may need to install PCRE2 with something similar to one of the following commands.

brew install pcre2          # macOS with Homebrew
sudo apt-get install libpcre2-dev   # Ubuntu / Debian
vcpkg install pcre2:x64-windows     # Windows (via vcpkg)

Binary wheels for Linux, macOS (arm64 and x86_64), and Windows are built in the GitHub CI for each tagged release and bundle PCRE2 and libcleri, so an end-user pip install extxyz does not need either system library.

Stable releases are made to PyPI, so you can install with

pip install extxyz                # standalone parser, no ASE
pip install ase-extxyz            # ASE plugin (pulls in extxyz + ase)

The Python API on extxyz itself is the dict/array based Frame parser:

import extxyz
for frame in extxyz.iread_dicts('trajectory.xyz'):
    print(frame.natoms, frame.cell, list(frame.arrays))

For ASE-aware reading/writing see the ase-extxyz sibling package.

Performance: cextxyz vs ASE built-in extxyz reader

ASE already ships a regex-based extxyz reader. The cextxyz plugin re-parses with the libcleri-based C grammar, with PCRE2 JIT compilation enabled both on the per-atom data regex (PCRE2_JIT_COMPLETE + PCRE2_ANCHORED) and on libcleri's internal regexes (so the comment-line grammar walk also runs JIT'd code).

Benchmark on a single-frame file with N Cu atoms (positions, forces, and a couple of info keys):

atoms / frame file size ASE built-in extxyz cextxyz plugin extxyz.read_dicts (no Atoms) speedup, plugin / built-in speedup, parser / built-in
10 0.00 MB 0.142 ms 0.202 ms 0.154 ms 0.70× 0.92×
100 0.01 MB 0.255 ms 0.233 ms 0.191 ms 1.10× 1.33×
1 000 0.11 MB 1.355 ms 0.748 ms 0.677 ms 1.81× 2.00×
4 000 0.44 MB 4.805 ms 2.306 ms 1.978 ms 2.08× 2.43×
16 000 1.74 MB 18.7 ms 8.42 ms 7.80 ms 2.22× 2.39×
64 000 6.98 MB 76.0 ms 33.5 ms 30.7 ms 2.27× 2.47×
200 000 21.80 MB 233.2 ms 107.1 ms 92.7 ms 2.18× 2.51×

Read-time benchmark

Below ~100 atoms per frame the per-call setup (file open, PCRE2 JIT compile, libcleri grammar walk for the comment line) is larger than the regex match itself, so the built-in is faster on tiny files. From ~1 000 atoms upwards the parser dominates and cextxyz runs at a steady ~2.2× over the built-in end-to-end (~2.5× for the parser alone). The remaining gap between the two cextxyz curves is the Frame → Atoms translation in the ASE plugin layer; we shrink it by aliasing the parser's per-atom buffers directly into atoms.arrays (so Atoms.__init__ doesn't memcpy positions) and vectorising the species → atomic-number lookup with np.unique instead of a per-atom dict walk.

The big parser-side lever was PCRE2 JIT (pcre2_jit_compile(re, PCRE2_JIT_COMPLETE) after pcre2_compile); a sample-based profile of the pre-JIT code attributed ~38 % of CPU to the per-atom pcre2_match and another ~14 % to libcleri's regex matching during the comment-line grammar walk. The same JIT call now wraps both call sites (the libcleri side via libAtoms/libcleri PR #2). On Linux, both call sites detect when running under valgrind via the LD_PRELOAD it injects and skip JIT compilation — PCRE2 JIT intentionally reads bytes past the input end as a speed trick, which valgrind reports as uninitialised-value warnings (PCRE2 docs explicitly call this out).

Reproduce locally (requires extxyz, ase-extxyz, ase, matplotlib):

python benchmarks/bench_read.py --max-atoms 200000 --repeats 3
python benchmarks/plot_bench.py

libextxyz C library and standalone executables

The C parser, the standalone libextxyz shared library, and the C-only cextxyz test driver are all Meson targets. To build them outside of the Python wheel flow:

meson setup builddir
meson compile -C builddir extxyz cextxyz       # libextxyz.{so,dylib,dll} + cextxyz
meson install -C builddir                      # installs libextxyz under --prefix

The Meson build picks up PCRE2 via pkg-config, falling back to a bundled WrapDB build of PCRE2 if no system copy is found.

Fortran bindings

To build the fextxyz executable demonstrating the Fortran bindings, you first need to compile QUIP's libAtoms library. QUIP now uses Meson too:

git clone --recursive https://github.com/libAtoms/QUIP
meson setup QUIP/builddir QUIP -Dgap=true -Dmpi=false
meson compile -C QUIP/builddir libAtoms f90wrap_stub

Then point this project's Meson build at the resulting library and module directories — the fextxyz target is opt-in via the quip_lib_dir and quip_mod_dir options:

QUIP_LIB_DIR=$PWD/QUIP/builddir/src/libAtoms
QUIP_MOD_DIR=$(find "$QUIP_LIB_DIR" -iname 'libatoms_module.mod' -printf '%h\n' | head -1)
meson setup builddir \
  -Dquip_lib_dir="$QUIP_LIB_DIR" \
  -Dquip_mod_dir="$QUIP_MOD_DIR"
meson compile -C builddir fextxyz

The Fortran bindings will later be moved to QUIP, since they are tied to QUIP's Dictionary and Atoms types.

Julia bindings

Julia bindings are distributed in a separate package, named ExtXYZ.jl. See its documentation for further details.

Usage

Usage of the Python package is similar to the ase.io.read() and ase.io.write() functions, e.g:

from extxyz import read, iread, write, ExtXYZTrajectoryWriter
from ase.build import bulk
from ase.optimize import BFGS
from ase.calculators.emt import EMT

atoms = bulk("Cu") * 3
frames = [atoms.copy() for frame in range(3)]
for frame in frames:
    frame.rattle()
    
write("filename.xyz", frames)

frames = read("filename.xyz") # all frames in file
atoms = read("filename.xyz", index=0) # first frame in file
write("newfile.xyz", frames)

traj = ExtXYZTrajectoryWriter("traj.xyz", atoms=atoms)
atoms.calc = EMT()
opt = BFGS(atoms, trajectory=traj)
opt.run(fmax=1e-3)

There is also an extxyz command line tool for testing purposes, see extxyz -h for help. This can alternatively be invoked via python -m extxyz.

Remaining issues

  1. make treatement of 9 elem old-1d consistent: now extxyz.py always reshapes (not just Lattice) to 3x3, but extxyz.c does not.
  2. Since we're using python regexp/PCRE, we could make per-atom strings be more complex, e.g. bare or quoted strings from key-value pairs. Should we?
  3. Decide what to do about unparseable comment lines. Just assume an old fashioned xyz with an arbitrary line, or fail? I don't think we really want every parsing breaking typo to result in plain xyz.
  4. Used to be able to quote with {}. Do we want to support this?

Extended XYZ specification

General formatting

  • Allowed characters: printable subset of ASCII, single byte
  • Allowed whitespace: plain space and tab (no fancy unicode nonbreaking space, etc)
  • Allowed end-of line (EOL) characters set by implementation + OS
    • pure python: whatever is used to return lines by file object iterator
    • low level c: fgets()
  • Blank lines: allowed only as 2nd line of each frame (for plain xyz) and at end of file

General definitions

  • regex: PCRE/python regular expression
  • Whitespace: regex \s, i.e. space and tab

Primitive Data Types

String

Sequence of one or more allowed characters, optionally quoted, but must be quoted in some circumstances.

  • Allowed characters - all except newline
  • Entire string may be surrounded by double quotes, as first and last characters (must match). Quotes inside string that are same as containing quotes must be escaped with backslash. Outermost double quotes are not considered part of string value.
  • Strings that contain any of the following characters must be quoted (not just backslash escaped)
    • whitespace (regex \s)
    • equals =
    • double quote ", must be represented by \"
    • comma ,
    • open or close square bracket [ ] or curly brackets { }
    • backslash, must be represented by double backslash \\
    • newline, must be represented by \n
  • Backslash \: only present in quoted strings, only used for escaping next character. All backslash escaped characters are the following character itself except \n, which encodes a newline.
  • Must conform to one of the following regex
    • quoted string: (")(?:(?=(\\?))\2.)*?\1
    • bare (unquoted) string: (?:[^\s=",}{\]\[\\]|(?:\\[\s=",}{\]\[\\]))+
  • only used in comment line key-value pairs, not per-atom data

Simple string

Sequence of one or more allowed characters, unquoted (so even outermost quotes are part of string), and without whitespace

  • allowed characters - regex \S, i.e. all except newline and whitespace
  • regex \S+
  • only used in per-atom data, not comment line key-value pairs

Logical/boolean

  • T or F or [tT]rue or [fF]alse or TRUE or FALSE
  • regex
    • true: (?:[tT]rue|TRUE|T)\b
    • false: (?:[fF]alse|FALSE|F)\b

Integer number

string of one or more decimal digits, optionally preceded by sign

  • regex [+-]?+(?:0|[1-9][0-9]*)+\b

Floating point number

  • optional leading sign [+-], decimal number including optional decimal point ., optional [dDeE] folllowed by exponent consisting of optional sign followed by string of one or more digits
  • regex
    • integer without leading sign bare_int = '(?:0|[1-9][0-9]*)'
    • optional sign opt_sign = '[+-]?'
    • floating number with decimal point float_dec = '(?:' + bare_int + '\.|\.)[0-9]*'
    • exponent exp = '(?:[dDeE]'+opt_sign+'[0-9]+)?'
    • end of number num_end = '(?:\b|(?=\W)|$)'
    • combined float regexp opt_sign + '(?:' + float_dec + exp + '|' + bare_int + exp + '|' + bare_int + ')' + num_end

Order for identifying primitive data types, accept first one that matches

  • int
  • float
  • bool
  • bare string (containing no whitespace or special characters)
  • quoted string (starting and ending with double quote and containing only allowed characters)

one dimensional array (vector)

sequence of one or more of the same primitive type

  • new style: opens with [, one or more of the same primitive type separated by commas and optional whitespace, ends with ]
  • backward compatible: opens with " or {, one or more of the same primitive types (all types allowed in {}, all except string in "") separated by whitespace, ends with matching " or }. For backward compatibility, a single element backward compatible array is interpreted as a scalar of the same type.
  • primitive data type is determined by same priority as single primitive item, but must be satisfied by entire list simultaneously. E.g. all integers will result in an integer array, but a mix of integer and float will result in a float array, and a mix of integer and valid strings will results in a string array.

two dimensional array (matrix)

sequence of one or more new style one dimensional arrays of the same length and type

  • opens with [, one or more new style one dimensional arrays separated by commas, ends with ]
  • all contained one dimensional arrays in a single two dimensional array must have same number and primitive data type elements, and will be promoted to other possible types if necessary to parse entire array. E.g. a row of integers followed by a row of strings will be promoted to a 2-d string array.

XYZ file

A concatenation of 1 or more FRAMES (below), with optional blank lines at the end (but not between frames)

FRAME

  • Line 1: a single integer <N> preceded and followed by optional whitespace
  • Line 2: zero or more per-config key=value pairs (see key-value pairs below)
  • Lines 3..N+2: per-atom data lines with M columns each (see Properties and Per-Atom Data below)

key=value pairs on second ("comment") line

Associates per-configuration value with key. Spaces are allowed around = sign, which do not become part of the key or value.

Key: bare or quoted string

Value: primitive type, 1-D array, or 2-D array. Type is determined from context according to order specified above.

Special key "Properties”: defines the columns in the subsequent lines in the frame.

  • Value is a string with the format of a series of triplets, separated by “:”, each triplet having the format: “<name>:<T>:<m>”.
    • The <name> (string) names the column(s), <T> is a one of “S”, “I”, “R”, “L”, and indicates the type in the column, “string”, “integer”, “real”, “logical”, respectively. <m> is an integer > 0 specifying how many consecutive columns are being referred to.
    • The sum of the counts "m" must equal number of per-atom columns M (as defined in FRAME)
  • If after full parsing the key “Properties” is missing, the format is retroactively assumed to be plain xyz (4 columns, Z/species x y z), the entire second line is stored as a per-config “comment” property, and columns beyond the 4th are not read.

Per-atom data lines

Each column contains a sequence of primitive types, except string, which is replaced with simple string, separated by one or more whitespace characters, ending with EOL (optional for last line). The total number of columns in each row must be equal to the M and to the sum of the counts "m" in the "Properties" value string.

READING ase.atoms.Atoms FROM THIS FORMAT

Specific keys indicate special values, with specific order for overriding

Key-value pairs:

  • Lattice -> Atoms.cell, optional [do we want to accept "cell" also?]
    • 3x3 matrix - rows are cell vectors [preferred]
    • 9-vector - 3 cell vectors concatenated [only for backward compat]
    • 3-vector - diagonal entries of cell matrix [?]
  • pbc -> Atoms.pbc, optional
    • 3-vector of bool
    • default [False]*3 if no Lattice, otherwise [True]*3
  • Calculator results, used to set SinglePointCalculator.results dict
    • all per-config properties in ase.calculator.all_properties, with same name
    • scalars, vectors - directly stored
    • stress
      • 6-vector Voigt
      • 9-vector, 3x3 matrix, stored as stress Voigt-6, fail if not symmetric
    • virial -> stress (to convert multiply by -1/cell_vol), same format as stress [warn/fail if stress also present, perhaps only if inconsistent?]

Properties keys (all types are per-atom), types are simple

  • Atoms
    • Z -> numbers
    • species -> numbers, fail if not valid chemical symbol [warn/fail if conflict with Z?]
    • pos -> positions
    • mass -> masses
    • velo -> momenta (get mass from atomic number if missing)
    • same name: initial_charges, initial_magmoms
  • Calculator.results
    • local_energy -> energies
    • forces -> forces [also support “force”? What about overriding, complain if inconsistent?]
    • same name: magmoms (scalar or 3-vector), charges

WRITING ase.atoms.Atoms TO THIS FORMAT

General considerations

  • platform-appropriate EOL
  • [require some specific whitespace convention?]
  • scalars
    • all strings are quoted
    • otherwise stored unquoted
  • arrays
    • use {} [or []?] container marks, comma separated (not backward compatible " and space separated forms)
  • Definitely store (naming as described below)
    • all "first-class" Atoms properties (cell, pbc, numbers, masses, positions, momenta [any others?])
    • all info keys that are scalar, 1-D, 2-D array of prim type
    • all arrays that are scalar (Natoms x 1) or 1-D array( Natoms x (m > 1)) of prim type, shape[1] mapped to number of columns and space separated, not using regular array notation
    • [optionally warn about un-representable quantities?]
  • all Calculator.results key-value pairs, per-config same as info, per-atom same as arrays
  • Perhaps store
    • all info keys, per-config calculator results that are not representable (i.e. not prim type scalar, 1-D, or 2-D for per-config only) but can be mapped to JSON, as string starting with "_JSON "
    • same for arrays [?]
  • In general, keep ASE data type/dimension, invert mapping of names for reading. For quantities that have multiple possible names, use:
    • Lattice, not cell, 3x3 matrix
    • velo, not momenta
    • stress, not virial, as 3x3 matrix [are we OK with this?]

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.

extxyz-0.3.2-cp313-cp313-win_amd64.whl (286.4 kB view details)

Uploaded CPython 3.13Windows x86-64

extxyz-0.3.2-cp313-cp313-manylinux_2_28_x86_64.whl (262.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

extxyz-0.3.2-cp313-cp313-macosx_11_0_x86_64.whl (255.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

extxyz-0.3.2-cp313-cp313-macosx_11_0_arm64.whl (267.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

extxyz-0.3.2-cp312-cp312-win_amd64.whl (286.4 kB view details)

Uploaded CPython 3.12Windows x86-64

extxyz-0.3.2-cp312-cp312-manylinux_2_28_x86_64.whl (262.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

extxyz-0.3.2-cp312-cp312-macosx_11_0_x86_64.whl (255.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

extxyz-0.3.2-cp312-cp312-macosx_11_0_arm64.whl (267.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

extxyz-0.3.2-cp311-cp311-win_amd64.whl (286.4 kB view details)

Uploaded CPython 3.11Windows x86-64

extxyz-0.3.2-cp311-cp311-manylinux_2_28_x86_64.whl (262.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

extxyz-0.3.2-cp311-cp311-macosx_11_0_x86_64.whl (255.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

extxyz-0.3.2-cp311-cp311-macosx_11_0_arm64.whl (267.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

extxyz-0.3.2-cp310-cp310-win_amd64.whl (286.4 kB view details)

Uploaded CPython 3.10Windows x86-64

extxyz-0.3.2-cp310-cp310-manylinux_2_28_x86_64.whl (262.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

extxyz-0.3.2-cp310-cp310-macosx_11_0_x86_64.whl (255.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

extxyz-0.3.2-cp310-cp310-macosx_11_0_arm64.whl (267.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file extxyz-0.3.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: extxyz-0.3.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 286.4 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for extxyz-0.3.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d685ce78af1845df4841a8d470a108c4567c8eeee6af260ef0bed6310cb57e29
MD5 014fa012d48f2e735b080c7a30ecfc02
BLAKE2b-256 eca296b0765b67f824d71b9fa9238c5c5dcc0c4cece0ee4328acf66f360ca322

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for extxyz-0.3.2-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6da62be887f9e7c82f8557ad90ae6a7f7a547b1d93f2d3fe9a833bf07ab4f5b5
MD5 e2d7ed193f5d8a11d2314d5ed5f57509
BLAKE2b-256 09b5e76dcf206cb02f89b0d15a62b0976b9532a17e298b2949ac3d48153f9080

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp313-cp313-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for extxyz-0.3.2-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 729ee9fb21e1f98cfbfe9263e4faf8c52966065359b9706019914d93842c73f0
MD5 efbe30a1bfeaa0c645e79774586e60ab
BLAKE2b-256 ec23a2e070d06017290f0f30acc2fa1e08fb02040b831982135c7565d9a90b07

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for extxyz-0.3.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 725d96f3a843b42fce2382040a5c2b0e0d975e4db7129356af1073a65bd7a46f
MD5 8fc431aaf8aee3504f665c68a19db3d0
BLAKE2b-256 0c317023d3b4457c400e0fa2fc5a54f639c56254057d1aea49bb442871d69472

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: extxyz-0.3.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 286.4 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for extxyz-0.3.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f9a5b77ac4bcc3576e26218c9d679054d80bb80e69079a6a0022847927d4bee3
MD5 c242f6297044ad1cc8d50f1b00997f9b
BLAKE2b-256 87c846bfb2305fcbda6d3e268831a6daf403b6b2aaaed08ba69f784aaaa081bf

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for extxyz-0.3.2-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5402828dd7178447963a33101acdd95526b7e39fc7c8fffdb4c6345504b6b0d2
MD5 a61d0ca4c3717893543eb5378893e329
BLAKE2b-256 e18de9dc65bc9cfaec7a9d87610de494d4cde6441c5f93f9d7dacd15799f6130

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for extxyz-0.3.2-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 69262c2758239e6b77e992d7e3fd530a6fcc0633b8c62cd41f118c0b3bfb54ae
MD5 70e9bf1bf62d2fcfb69b9bcb207f8c1f
BLAKE2b-256 173675b516deea37832b3dec8e1be0efcc198a51f7fc0c284c03581d53eba7c1

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for extxyz-0.3.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0032f965d51d7e72a2831554f065a42edd7fabb599894549105ab540a006220b
MD5 cca1c7afef55cb5cb406c32a5f631342
BLAKE2b-256 8242b26bfc76e07c78b0dec958f19c9b7561c6c8b0a3aecebe0f8c117016d954

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: extxyz-0.3.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 286.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for extxyz-0.3.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ba181884c657d2413c05ab3db4a6ca62bd341b9029ef5ad23125fba46e9ac231
MD5 49c1513d58091a343f5790eccfadf09b
BLAKE2b-256 be5bbd3a9108b90e143a7d75f45e696907042c90704897ea2920a157b14f92cf

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for extxyz-0.3.2-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3870bef2b8b9f1b0c7bad8e0a2abf706a5e273231dd9084d34ef470e307d52a9
MD5 aa449b2810cea4abe43eed5e92c8c55c
BLAKE2b-256 6c9af1e18c52ca6911baf4e073373287630e22ca96e4cb2c7ab05dfe07114d67

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for extxyz-0.3.2-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 ad7bbbcccb845a7b41e749cf3061b6cc1ca266faf4f21a95c7e8e860c7ef982d
MD5 d8893dcc4dba140b688c5ec864f5f81a
BLAKE2b-256 99149946cd2fb5de5f3af4a0bfa190074e722251ce0ae1756ccc31d0876d5b5d

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for extxyz-0.3.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 03e786237a1db0054385ad02f9c2461470ddf9ed22cfb2b51e26ce8982d8f7c9
MD5 80ecc5617c7028869c03c092473d2fdc
BLAKE2b-256 cac9651f410208c24a5e8ecd2852386d22788dd517d3312d13f21a4f182881ec

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: extxyz-0.3.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 286.4 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for extxyz-0.3.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 ea1505dd257bbab8cb4a51c3de9842b30ccfa44bbe7fb0b259e457cb54832be9
MD5 d20a35d0ea0a9fc9eeb8e10b35788391
BLAKE2b-256 39b9924f535b34be1c82042e529efb8f63e642ddc252030dbd7d8ba16d407a7d

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for extxyz-0.3.2-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f8b233f6bf79c3e18ee5ecca9bd815cf4a10c221db007c9bf9a3a5e7f45eaa55
MD5 4ca1badb6351d81abb8e5ca444635102
BLAKE2b-256 74c5f440794f0547f710c08d6c364dfa8b62f6b8c66536bced4ae20ec6b28e4a

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for extxyz-0.3.2-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 cc6df8f4a4bb516c7b07b2d3fffe1ddd778407739ae9d34400962dbad2ede019
MD5 7a69bb8bc5fd95bea1345083f7b8510f
BLAKE2b-256 723c90e492d2ffd4270120776ce4330f7d70e422ec8ae37db18e9ff7c082f189

See more details on using hashes here.

File details

Details for the file extxyz-0.3.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for extxyz-0.3.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e779a4145084e090817c5f3cc1cf49b6cb7df2af5008c0c0e61454e127860ee3
MD5 20d9a5e9f772600c3731e5f5ee30a08a
BLAKE2b-256 98b7a6b6fc7ddcf10ee7d169bc601a0d95cfad6b78dd2c55b5b72bc18819aeff

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