scandir, a better directory iterator and faster os.walk()
=========================================================
.. image:: https://img.shields.io/pypi/v/scandir.svg
:target: https://pypi.python.org/pypi/scandir
:alt: scandir on PyPI (Python Package Index)
.. image:: https://travis-ci.org/benhoyt/scandir.svg?branch=master
:target: https://travis-ci.org/benhoyt/scandir
:alt: Travis CI tests (Linux)
.. image:: https://ci.appveyor.com/api/projects/status/github/benhoyt/scandir?branch=master&svg=true
:target: https://ci.appveyor.com/project/benhoyt/scandir
:alt: Appveyor tests (Windows)
``scandir()`` is a directory iteration function like ``os.listdir()``,
except that instead of returning a list of bare filenames, it yields
``DirEntry`` objects that include file type and stat information along
with the name. Using ``scandir()`` increases the speed of ``os.walk()``
by 2-20 times (depending on the platform and file system) by avoiding
unnecessary calls to ``os.stat()`` in most cases.
Now included in a Python near you!
----------------------------------
``scandir`` has been included in the Python 3.5 standard library as
``os.scandir()``, and the related performance improvements to
``os.walk()`` have also been included. So if you're lucky enough to be
using Python 3.5 (release date September 13, 2015) you get the benefit
immediately, otherwise just
`download this module from PyPI <https://pypi.python.org/pypi/scandir>`_,
install it with ``pip install scandir``, and then do something like
this in your code:
.. code-block:: python
# Use the built-in version of scandir/walk if possible, otherwise
# use the scandir module version
try:
from os import scandir, walk
except ImportError:
from scandir import scandir, walk
`PEP 471 <https://www.python.org/dev/peps/pep-0471/>`_, which is the
PEP that proposes including ``scandir`` in the Python standard library,
was `accepted <https://mail.python.org/pipermail/python-dev/2014-July/135561.html>`_
in July 2014 by Victor Stinner, the BDFL-delegate for the PEP.
This ``scandir`` module is intended to work on Python 2.7+ and Python
3.4+ (and it has been tested on those versions).
Background
----------
Python's built-in ``os.walk()`` is significantly slower than it needs to be,
because -- in addition to calling ``listdir()`` on each directory -- it calls
``stat()`` on each file to determine whether the filename is a directory or not.
But both ``FindFirstFile`` / ``FindNextFile`` on Windows and ``readdir`` on Linux/OS
X already tell you whether the files returned are directories or not, so
no further ``stat`` system calls are needed. In short, you can reduce the number
of system calls from about 2N to N, where N is the total number of files and
directories in the tree.
In practice, removing all those extra system calls makes ``os.walk()`` about
**7-50 times as fast on Windows, and about 3-10 times as fast on Linux and Mac OS
X.** So we're not talking about micro-optimizations. See more benchmarks
in the "Benchmarks" section below.
Somewhat relatedly, many people have also asked for a version of
``os.listdir()`` that yields filenames as it iterates instead of returning them
as one big list. This improves memory efficiency for iterating very large
directories.
So as well as a faster ``walk()``, scandir adds a new ``scandir()`` function.
They're pretty easy to use, but see "The API" below for the full docs.
Benchmarks
----------
Below are results showing how many times as fast ``scandir.walk()`` is than
``os.walk()`` on various systems, found by running ``benchmark.py`` with no
arguments:
==================== ============== =============
System version Python version Times as fast
==================== ============== =============
Windows 7 64-bit 2.7.7 64-bit 10.4
Windows 7 64-bit SSD 2.7.7 64-bit 10.3
Windows 7 64-bit NFS 2.7.6 64-bit 36.8
Windows 7 64-bit SSD 3.4.1 64-bit 9.9
Windows 7 64-bit SSD 3.5.0 64-bit 9.5
Ubuntu 14.04 64-bit 2.7.6 64-bit 5.8
Mac OS X 10.9.3 2.7.5 64-bit 3.8
==================== ============== =============
All of the above tests were done using the fast C version of scandir
(source code in ``_scandir.c``).
Note that the gains are less than the above on smaller directories and greater
on larger directories. This is why ``benchmark.py`` creates a test directory
tree with a standardized size.
The API
-------
walk()
~~~~~~
The API for ``scandir.walk()`` is exactly the same as ``os.walk()``, so just
`read the Python docs <https://docs.python.org/3.5/library/os.html#os.walk>`_.
scandir()
~~~~~~~~~
The full docs for ``scandir()`` and the ``DirEntry`` objects it yields are
available in the `Python documentation here <https://docs.python.org/3.5/library/os.html#os.scandir>`_.
But below is a brief summary as well.
scandir(path='.') -> iterator of DirEntry objects for given path
Like ``listdir``, ``scandir`` calls the operating system's directory
iteration system calls to get the names of the files in the given
``path``, but it's different from ``listdir`` in two ways:
* Instead of returning bare filename strings, it returns lightweight
``DirEntry`` objects that hold the filename string and provide
simple methods that allow access to the additional data the
operating system may have returned.
* It returns a generator instead of a list, so that ``scandir`` acts
as a true iterator instead of returning the full list immediately.
``scandir()`` yields a ``DirEntry`` object for each file and
sub-directory in ``path``. Just like ``listdir``, the ``'.'``
and ``'..'`` pseudo-directories are skipped, and the entries are
yielded in system-dependent order. Each ``DirEntry`` object has the
following attributes and methods:
* ``name``: the entry's filename, relative to the scandir ``path``
argument (corresponds to the return values of ``os.listdir``)
* ``path``: the entry's full path name (not necessarily an absolute
path) -- the equivalent of ``os.path.join(scandir_path, entry.name)``
* ``is_dir(*, follow_symlinks=True)``: similar to
``pathlib.Path.is_dir()``, but the return value is cached on the
``DirEntry`` object; doesn't require a system call in most cases;
don't follow symbolic links if ``follow_symlinks`` is False
* ``is_file(*, follow_symlinks=True)``: similar to
``pathlib.Path.is_file()``, but the return value is cached on the
``DirEntry`` object; doesn't require a system call in most cases;
don't follow symbolic links if ``follow_symlinks`` is False
* ``is_symlink()``: similar to ``pathlib.Path.is_symlink()``, but the
return value is cached on the ``DirEntry`` object; doesn't require a
system call in most cases
* ``stat(*, follow_symlinks=True)``: like ``os.stat()``, but the
return value is cached on the ``DirEntry`` object; does not require a
system call on Windows (except for symlinks); don't follow symbolic links
(like ``os.lstat()``) if ``follow_symlinks`` is False
* ``inode()``: return the inode number of the entry; the return value
is cached on the ``DirEntry`` object
Here's a very simple example of ``scandir()`` showing use of the
``DirEntry.name`` attribute and the ``DirEntry.is_dir()`` method:
.. code-block:: python
def subdirs(path):
"""Yield directory names not starting with '.' under given path."""
for entry in os.scandir(path):
if not entry.name.startswith('.') and entry.is_dir():
yield entry.name
This ``subdirs()`` function will be significantly faster with scandir
than ``os.listdir()`` and ``os.path.isdir()`` on both Windows and POSIX
systems, especially on medium-sized or large directories.
Further reading
---------------
* `The Python docs for scandir <https://docs.python.org/3.5/library/os.html#os.scandir>`_
* `PEP 471 <https://www.python.org/dev/peps/pep-0471/>`_, the
(now-accepted) Python Enhancement Proposal that proposed adding
``scandir`` to the standard library -- a lot of details here,
including rejected ideas and previous discussion
Flames, comments, bug reports
-----------------------------
Please send flames, comments, and questions about scandir to Ben Hoyt:
http://benhoyt.com/
File bug reports for the version in the Python 3.5 standard library
`here <https://docs.python.org/3.5/bugs.html>`_, or file bug reports
or feature requests for this module at the GitHub project page:
https://github.com/benhoyt/scandir
Raw data
{
"_id": null,
"home_page": "https://github.com/benhoyt/scandir",
"name": "scandir",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "",
"author": "Ben Hoyt",
"author_email": "benhoyt@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/df/f5/9c052db7bd54d0cbf1bc0bb6554362bba1012d03e5888950a4f5c5dadc4e/scandir-1.10.0.tar.gz",
"platform": "",
"description": "scandir, a better directory iterator and faster os.walk()\r\n=========================================================\r\n\r\n.. image:: https://img.shields.io/pypi/v/scandir.svg\r\n :target: https://pypi.python.org/pypi/scandir\r\n :alt: scandir on PyPI (Python Package Index)\r\n\r\n.. image:: https://travis-ci.org/benhoyt/scandir.svg?branch=master\r\n :target: https://travis-ci.org/benhoyt/scandir\r\n :alt: Travis CI tests (Linux)\r\n\r\n.. image:: https://ci.appveyor.com/api/projects/status/github/benhoyt/scandir?branch=master&svg=true\r\n :target: https://ci.appveyor.com/project/benhoyt/scandir\r\n :alt: Appveyor tests (Windows)\r\n\r\n\r\n``scandir()`` is a directory iteration function like ``os.listdir()``,\r\nexcept that instead of returning a list of bare filenames, it yields\r\n``DirEntry`` objects that include file type and stat information along\r\nwith the name. Using ``scandir()`` increases the speed of ``os.walk()``\r\nby 2-20 times (depending on the platform and file system) by avoiding\r\nunnecessary calls to ``os.stat()`` in most cases.\r\n\r\n\r\nNow included in a Python near you!\r\n----------------------------------\r\n\r\n``scandir`` has been included in the Python 3.5 standard library as\r\n``os.scandir()``, and the related performance improvements to\r\n``os.walk()`` have also been included. So if you're lucky enough to be\r\nusing Python 3.5 (release date September 13, 2015) you get the benefit\r\nimmediately, otherwise just\r\n`download this module from PyPI <https://pypi.python.org/pypi/scandir>`_,\r\ninstall it with ``pip install scandir``, and then do something like\r\nthis in your code:\r\n\r\n.. code-block:: python\r\n\r\n # Use the built-in version of scandir/walk if possible, otherwise\r\n # use the scandir module version\r\n try:\r\n from os import scandir, walk\r\n except ImportError:\r\n from scandir import scandir, walk\r\n\r\n`PEP 471 <https://www.python.org/dev/peps/pep-0471/>`_, which is the\r\nPEP that proposes including ``scandir`` in the Python standard library,\r\nwas `accepted <https://mail.python.org/pipermail/python-dev/2014-July/135561.html>`_\r\nin July 2014 by Victor Stinner, the BDFL-delegate for the PEP.\r\n\r\nThis ``scandir`` module is intended to work on Python 2.7+ and Python\r\n3.4+ (and it has been tested on those versions).\r\n\r\n\r\nBackground\r\n----------\r\n\r\nPython's built-in ``os.walk()`` is significantly slower than it needs to be,\r\nbecause -- in addition to calling ``listdir()`` on each directory -- it calls\r\n``stat()`` on each file to determine whether the filename is a directory or not.\r\nBut both ``FindFirstFile`` / ``FindNextFile`` on Windows and ``readdir`` on Linux/OS\r\nX already tell you whether the files returned are directories or not, so\r\nno further ``stat`` system calls are needed. In short, you can reduce the number\r\nof system calls from about 2N to N, where N is the total number of files and\r\ndirectories in the tree.\r\n\r\nIn practice, removing all those extra system calls makes ``os.walk()`` about\r\n**7-50 times as fast on Windows, and about 3-10 times as fast on Linux and Mac OS\r\nX.** So we're not talking about micro-optimizations. See more benchmarks\r\nin the \"Benchmarks\" section below.\r\n\r\nSomewhat relatedly, many people have also asked for a version of\r\n``os.listdir()`` that yields filenames as it iterates instead of returning them\r\nas one big list. This improves memory efficiency for iterating very large\r\ndirectories.\r\n\r\nSo as well as a faster ``walk()``, scandir adds a new ``scandir()`` function.\r\nThey're pretty easy to use, but see \"The API\" below for the full docs.\r\n\r\n\r\nBenchmarks\r\n----------\r\n\r\nBelow are results showing how many times as fast ``scandir.walk()`` is than\r\n``os.walk()`` on various systems, found by running ``benchmark.py`` with no\r\narguments:\r\n\r\n==================== ============== =============\r\nSystem version Python version Times as fast\r\n==================== ============== =============\r\nWindows 7 64-bit 2.7.7 64-bit 10.4\r\nWindows 7 64-bit SSD 2.7.7 64-bit 10.3\r\nWindows 7 64-bit NFS 2.7.6 64-bit 36.8\r\nWindows 7 64-bit SSD 3.4.1 64-bit 9.9\r\nWindows 7 64-bit SSD 3.5.0 64-bit 9.5\r\nUbuntu 14.04 64-bit 2.7.6 64-bit 5.8\r\nMac OS X 10.9.3 2.7.5 64-bit 3.8\r\n==================== ============== =============\r\n\r\nAll of the above tests were done using the fast C version of scandir\r\n(source code in ``_scandir.c``).\r\n\r\nNote that the gains are less than the above on smaller directories and greater\r\non larger directories. This is why ``benchmark.py`` creates a test directory\r\ntree with a standardized size.\r\n\r\n\r\nThe API\r\n-------\r\n\r\nwalk()\r\n~~~~~~\r\n\r\nThe API for ``scandir.walk()`` is exactly the same as ``os.walk()``, so just\r\n`read the Python docs <https://docs.python.org/3.5/library/os.html#os.walk>`_.\r\n\r\nscandir()\r\n~~~~~~~~~\r\n\r\nThe full docs for ``scandir()`` and the ``DirEntry`` objects it yields are\r\navailable in the `Python documentation here <https://docs.python.org/3.5/library/os.html#os.scandir>`_. \r\nBut below is a brief summary as well.\r\n\r\n scandir(path='.') -> iterator of DirEntry objects for given path\r\n\r\nLike ``listdir``, ``scandir`` calls the operating system's directory\r\niteration system calls to get the names of the files in the given\r\n``path``, but it's different from ``listdir`` in two ways:\r\n\r\n* Instead of returning bare filename strings, it returns lightweight\r\n ``DirEntry`` objects that hold the filename string and provide\r\n simple methods that allow access to the additional data the\r\n operating system may have returned.\r\n\r\n* It returns a generator instead of a list, so that ``scandir`` acts\r\n as a true iterator instead of returning the full list immediately.\r\n\r\n``scandir()`` yields a ``DirEntry`` object for each file and\r\nsub-directory in ``path``. Just like ``listdir``, the ``'.'``\r\nand ``'..'`` pseudo-directories are skipped, and the entries are\r\nyielded in system-dependent order. Each ``DirEntry`` object has the\r\nfollowing attributes and methods:\r\n\r\n* ``name``: the entry's filename, relative to the scandir ``path``\r\n argument (corresponds to the return values of ``os.listdir``)\r\n\r\n* ``path``: the entry's full path name (not necessarily an absolute\r\n path) -- the equivalent of ``os.path.join(scandir_path, entry.name)``\r\n\r\n* ``is_dir(*, follow_symlinks=True)``: similar to\r\n ``pathlib.Path.is_dir()``, but the return value is cached on the\r\n ``DirEntry`` object; doesn't require a system call in most cases;\r\n don't follow symbolic links if ``follow_symlinks`` is False\r\n\r\n* ``is_file(*, follow_symlinks=True)``: similar to\r\n ``pathlib.Path.is_file()``, but the return value is cached on the\r\n ``DirEntry`` object; doesn't require a system call in most cases; \r\n don't follow symbolic links if ``follow_symlinks`` is False\r\n\r\n* ``is_symlink()``: similar to ``pathlib.Path.is_symlink()``, but the\r\n return value is cached on the ``DirEntry`` object; doesn't require a\r\n system call in most cases\r\n\r\n* ``stat(*, follow_symlinks=True)``: like ``os.stat()``, but the\r\n return value is cached on the ``DirEntry`` object; does not require a\r\n system call on Windows (except for symlinks); don't follow symbolic links\r\n (like ``os.lstat()``) if ``follow_symlinks`` is False\r\n\r\n* ``inode()``: return the inode number of the entry; the return value\r\n is cached on the ``DirEntry`` object\r\n\r\nHere's a very simple example of ``scandir()`` showing use of the\r\n``DirEntry.name`` attribute and the ``DirEntry.is_dir()`` method:\r\n\r\n.. code-block:: python\r\n\r\n def subdirs(path):\r\n \"\"\"Yield directory names not starting with '.' under given path.\"\"\"\r\n for entry in os.scandir(path):\r\n if not entry.name.startswith('.') and entry.is_dir():\r\n yield entry.name\r\n\r\nThis ``subdirs()`` function will be significantly faster with scandir\r\nthan ``os.listdir()`` and ``os.path.isdir()`` on both Windows and POSIX\r\nsystems, especially on medium-sized or large directories.\r\n\r\n\r\nFurther reading\r\n---------------\r\n\r\n* `The Python docs for scandir <https://docs.python.org/3.5/library/os.html#os.scandir>`_\r\n* `PEP 471 <https://www.python.org/dev/peps/pep-0471/>`_, the\r\n (now-accepted) Python Enhancement Proposal that proposed adding\r\n ``scandir`` to the standard library -- a lot of details here,\r\n including rejected ideas and previous discussion\r\n\r\n\r\nFlames, comments, bug reports\r\n-----------------------------\r\n\r\nPlease send flames, comments, and questions about scandir to Ben Hoyt:\r\n\r\nhttp://benhoyt.com/\r\n\r\nFile bug reports for the version in the Python 3.5 standard library\r\n`here <https://docs.python.org/3.5/bugs.html>`_, or file bug reports\r\nor feature requests for this module at the GitHub project page:\r\n\r\nhttps://github.com/benhoyt/scandir\r\n\r\n\r\n",
"bugtrack_url": null,
"license": "New BSD License",
"summary": "scandir, a better directory iterator and faster os.walk()",
"version": "1.10.0",
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "c68c43cc3799c79c435d1a236783993b2e04a2c750b4f91ef3630ec442490df5",
"md5": "ab1698106fc8a94dee536c93d51be79a",
"sha256": "92c85ac42f41ffdc35b6da57ed991575bdbe69db895507af88b9f499b701c188"
},
"downloads": -1,
"filename": "scandir-1.10.0-cp27-cp27m-win32.whl",
"has_sig": false,
"md5_digest": "ab1698106fc8a94dee536c93d51be79a",
"packagetype": "bdist_wheel",
"python_version": "cp27",
"requires_python": null,
"size": 20479,
"upload_time": "2019-03-09T17:58:19",
"upload_time_iso_8601": "2019-03-09T17:58:19.612572Z",
"url": "https://files.pythonhosted.org/packages/c6/8c/43cc3799c79c435d1a236783993b2e04a2c750b4f91ef3630ec442490df5/scandir-1.10.0-cp27-cp27m-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f9d06b7b38eaf9964510f5c32aa5aaf9f419864d2e0ebe34274e6cba5689a0c5",
"md5": "203f49b490e2ec2b2057f03e76985bb2",
"sha256": "cb925555f43060a1745d0a321cca94bcea927c50114b623d73179189a4e100ac"
},
"downloads": -1,
"filename": "scandir-1.10.0-cp27-cp27m-win_amd64.whl",
"has_sig": false,
"md5_digest": "203f49b490e2ec2b2057f03e76985bb2",
"packagetype": "bdist_wheel",
"python_version": "cp27",
"requires_python": null,
"size": 20919,
"upload_time": "2019-03-09T17:58:21",
"upload_time_iso_8601": "2019-03-09T17:58:21.380526Z",
"url": "https://files.pythonhosted.org/packages/f9/d0/6b7b38eaf9964510f5c32aa5aaf9f419864d2e0ebe34274e6cba5689a0c5/scandir-1.10.0-cp27-cp27m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0486417b435bd94a4e0176c10acea5b866a47a045848a346c6930fc846b2f016",
"md5": "5a5261ebc3309845a08723ce7b605b06",
"sha256": "2c712840c2e2ee8dfaf36034080108d30060d759c7b73a01a52251cc8989f11f"
},
"downloads": -1,
"filename": "scandir-1.10.0-cp34-cp34m-win32.whl",
"has_sig": false,
"md5_digest": "5a5261ebc3309845a08723ce7b605b06",
"packagetype": "bdist_wheel",
"python_version": "cp34",
"requires_python": null,
"size": 20152,
"upload_time": "2019-03-09T17:58:22",
"upload_time_iso_8601": "2019-03-09T17:58:22.790782Z",
"url": "https://files.pythonhosted.org/packages/04/86/417b435bd94a4e0176c10acea5b866a47a045848a346c6930fc846b2f016/scandir-1.10.0-cp34-cp34m-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "773a7f6111552b4736a08a72c37d6b8852cf77c02042a3124a8806f67008ad45",
"md5": "b76f7c1c1513a9006b1aef0562712a26",
"sha256": "2586c94e907d99617887daed6c1d102b5ca28f1085f90446554abf1faf73123e"
},
"downloads": -1,
"filename": "scandir-1.10.0-cp34-cp34m-win_amd64.whl",
"has_sig": false,
"md5_digest": "b76f7c1c1513a9006b1aef0562712a26",
"packagetype": "bdist_wheel",
"python_version": "cp34",
"requires_python": null,
"size": 20497,
"upload_time": "2019-03-09T17:58:24",
"upload_time_iso_8601": "2019-03-09T17:58:24.184841Z",
"url": "https://files.pythonhosted.org/packages/77/3a/7f6111552b4736a08a72c37d6b8852cf77c02042a3124a8806f67008ad45/scandir-1.10.0-cp34-cp34m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cda1d5c3e22090ebead6d24abbe0f85641f002db44316c0a422d68d2fa258a8c",
"md5": "695cc9235f54d915e3b79d470bb35274",
"sha256": "2b8e3888b11abb2217a32af0766bc06b65cc4a928d8727828ee68af5a967fa6f"
},
"downloads": -1,
"filename": "scandir-1.10.0-cp35-cp35m-win32.whl",
"has_sig": false,
"md5_digest": "695cc9235f54d915e3b79d470bb35274",
"packagetype": "bdist_wheel",
"python_version": "cp35",
"requires_python": null,
"size": 22110,
"upload_time": "2019-03-09T17:58:25",
"upload_time_iso_8601": "2019-03-09T17:58:25.490973Z",
"url": "https://files.pythonhosted.org/packages/cd/a1/d5c3e22090ebead6d24abbe0f85641f002db44316c0a422d68d2fa258a8c/scandir-1.10.0-cp35-cp35m-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b75dc0dc3933bd79fdca4780f84fffb2291672f3db8f0093c5d2ce629b7cb656",
"md5": "5468e5503744da4f2064a773667cd9f5",
"sha256": "8c5922863e44ffc00c5c693190648daa6d15e7c1207ed02d6f46a8dcc2869d32"
},
"downloads": -1,
"filename": "scandir-1.10.0-cp35-cp35m-win_amd64.whl",
"has_sig": false,
"md5_digest": "5468e5503744da4f2064a773667cd9f5",
"packagetype": "bdist_wheel",
"python_version": "cp35",
"requires_python": null,
"size": 22845,
"upload_time": "2019-03-09T17:58:26",
"upload_time_iso_8601": "2019-03-09T17:58:26.820588Z",
"url": "https://files.pythonhosted.org/packages/b7/5d/c0dc3933bd79fdca4780f84fffb2291672f3db8f0093c5d2ce629b7cb656/scandir-1.10.0-cp35-cp35m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "25c5257e7f38127de5221a57e6afd0eb6ad0a85412c92644bf8265f20085b22a",
"md5": "5139928bafc36cb763063091697a0f14",
"sha256": "2ae41f43797ca0c11591c0c35f2f5875fa99f8797cb1a1fd440497ec0ae4b022"
},
"downloads": -1,
"filename": "scandir-1.10.0-cp36-cp36m-win32.whl",
"has_sig": false,
"md5_digest": "5139928bafc36cb763063091697a0f14",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": null,
"size": 22111,
"upload_time": "2019-03-09T17:58:28",
"upload_time_iso_8601": "2019-03-09T17:58:28.265877Z",
"url": "https://files.pythonhosted.org/packages/25/c5/257e7f38127de5221a57e6afd0eb6ad0a85412c92644bf8265f20085b22a/scandir-1.10.0-cp36-cp36m-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a0c38b8244553f4cf8682825e46d264f0bf3b8f7a51c9ba4745c8aa9182da4e5",
"md5": "50303dbc67562351c895ff31b2f6bba1",
"sha256": "7d2d7a06a252764061a020407b997dd036f7bd6a175a5ba2b345f0a357f0b3f4"
},
"downloads": -1,
"filename": "scandir-1.10.0-cp36-cp36m-win_amd64.whl",
"has_sig": false,
"md5_digest": "50303dbc67562351c895ff31b2f6bba1",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": null,
"size": 22847,
"upload_time": "2019-03-09T17:58:29",
"upload_time_iso_8601": "2019-03-09T17:58:29.658885Z",
"url": "https://files.pythonhosted.org/packages/a0/c3/8b8244553f4cf8682825e46d264f0bf3b8f7a51c9ba4745c8aa9182da4e5/scandir-1.10.0-cp36-cp36m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9b474bf2941582c731b0c3a7aee7a3129063fe7dad5382cd662f3766dac619b2",
"md5": "5dbab653f3373e4a3b6467c508c7c817",
"sha256": "67f15b6f83e6507fdc6fca22fedf6ef8b334b399ca27c6b568cbfaa82a364173"
},
"downloads": -1,
"filename": "scandir-1.10.0-cp37-cp37m-win32.whl",
"has_sig": false,
"md5_digest": "5dbab653f3373e4a3b6467c508c7c817",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": null,
"size": 22109,
"upload_time": "2019-03-09T17:58:30",
"upload_time_iso_8601": "2019-03-09T17:58:30.790863Z",
"url": "https://files.pythonhosted.org/packages/9b/47/4bf2941582c731b0c3a7aee7a3129063fe7dad5382cd662f3766dac619b2/scandir-1.10.0-cp37-cp37m-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cb06cee31a831784ae66073fff7df58f823a1f6bc3947dc48a76f877b17eb52b",
"md5": "46b00959354c0a833473e5d0c82b38d0",
"sha256": "b24086f2375c4a094a6b51e78b4cf7ca16c721dcee2eddd7aa6494b42d6d519d"
},
"downloads": -1,
"filename": "scandir-1.10.0-cp37-cp37m-win_amd64.whl",
"has_sig": false,
"md5_digest": "46b00959354c0a833473e5d0c82b38d0",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": null,
"size": 22842,
"upload_time": "2019-03-09T17:58:32",
"upload_time_iso_8601": "2019-03-09T17:58:32.109312Z",
"url": "https://files.pythonhosted.org/packages/cb/06/cee31a831784ae66073fff7df58f823a1f6bc3947dc48a76f877b17eb52b/scandir-1.10.0-cp37-cp37m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "dff59c052db7bd54d0cbf1bc0bb6554362bba1012d03e5888950a4f5c5dadc4e",
"md5": "f8378f4d9f95a6a78e97ab01aa900c1d",
"sha256": "4d4631f6062e658e9007ab3149a9b914f3548cb38bfb021c64f39a025ce578ae"
},
"downloads": -1,
"filename": "scandir-1.10.0.tar.gz",
"has_sig": false,
"md5_digest": "f8378f4d9f95a6a78e97ab01aa900c1d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 33311,
"upload_time": "2019-03-09T17:58:33",
"upload_time_iso_8601": "2019-03-09T17:58:33.269204Z",
"url": "https://files.pythonhosted.org/packages/df/f5/9c052db7bd54d0cbf1bc0bb6554362bba1012d03e5888950a4f5c5dadc4e/scandir-1.10.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2019-03-09 17:58:33",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "benhoyt",
"github_project": "scandir",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "scandir"
}