---------------
pathlib_revised
---------------
Expand the origin Python `pathlib <https://docs.python.org/3/library/pathlib.html>`_ module:
* work-a-round for Windows MAX_PATH limit, by adding ``\\?\`` path prefix
* add missing stuff, like: ``makedirs``, ``utime``, ``scandir`` etc.
There is also the class, called `DirEntryPath <https://github.com/jedie/pathlib_revised/blob/master/pathlib_revised/dir_entry_path.py>`_ that holds more cached information than `os.DirEntry <https://docs.python.org/3/library/os.html#os.DirEntry>`_
* python 3.4 or newer only
* Beta state
Please, try, fork and contribute! ;)
+--------------------------------------+-----------------------------------------------------------+
| |Build Status on travis-ci.org| | `travis-ci.org/jedie/pathlib_revised`_ |
+--------------------------------------+-----------------------------------------------------------+
| |Build Status on appveyor.com| | `ci.appveyor.com/project/jedie/pathlib_revised`_ |
+--------------------------------------+-----------------------------------------------------------+
| |Coverage Status on coveralls.io| | `coveralls.io/r/jedie/pathlib_revised`_ |
+--------------------------------------+-----------------------------------------------------------+
| |Requirements Status on requires.io| | `requires.io/github/jedie/pathlib_revised/requirements/`_ |
+--------------------------------------+-----------------------------------------------------------+
.. |Build Status on travis-ci.org| image:: https://travis-ci.org/jedie/pathlib_revised.svg
.. _travis-ci.org/jedie/pathlib_revised: https://travis-ci.org/jedie/pathlib_revised/
.. |Build Status on appveyor.com| image:: https://ci.appveyor.com/api/projects/status/py5sl38ql3xciafc?svg=true
.. _ci.appveyor.com/project/jedie/pathlib_revised: https://ci.appveyor.com/project/jedie/pathlib_revised/history
.. |Coverage Status on coveralls.io| image:: https://coveralls.io/repos/jedie/pathlib_revised/badge.svg
.. _coveralls.io/r/jedie/pathlib_revised: https://coveralls.io/r/jedie/pathlib_revised
.. |Requirements Status on requires.io| image:: https://requires.io/github/jedie/pathlib_revised/requirements.svg?branch=master
.. _requires.io/github/jedie/pathlib_revised/requirements/: https://requires.io/github/jedie/pathlib_revised/requirements/
Windows MAX_PATH
================
There is a limit in the Windows API: Path can't be longer than 259 characters (called: "MAX_PATH").
The work-a-round is to add the prefix ``\\?\`` to every absolute path, see:
* `https://msdn.microsoft.com/en-us/library/aa365247.aspx#maxpath <https://msdn.microsoft.com/en-us/library/aa365247.aspx#maxpath>`_
The **Path2()** class has the additional property **extended_path**:
::
>>> from pathlib_revised import Path2
>>> p=Path2("c:\foo\bar")
>>> p.extended_path
'\\?\c:\foo\bar'
All existing methods of **Path2()** will internally use **extended_path**, so that the **MAX_PATH** limit is not longer a problem.
**extended_path** exist also under Posix-Systems, but it's the same as **path**:
::
>>> p=Path2("/foo/bar")
>>> p.path
'/foo/bar'
>>> p.extended_path
'/foo/bar'
Additional methods
==================
* os.**`listdir() <https://docs.python.org/3/library/os.html#os.listdir>`_**
<pre>
>>> Path2("/").listdir()
['sbin', 'boot', 'tmp', 'sys', 'var', 'dev', 'usr', 'root', 'home', ..., 'initrd.img', 'vmlinuz']
</pre> * shutil.**`copyfile() <https://docs.python.org/3/library/shutil.html#shutil.copyfile>`_**
<pre>
>>> Path2("a_file.txt").copyfile(Path2("a_file_copy.txt"))
</pre> * os.path.**`expanduser() <https://docs.python.org/3/library/os.path.html#os.path.expanduser>`_**
<pre>
>>> p=Path2("~", "sub", "dir")
>>> p
PosixPath2('~/sub/dir')
>>> p.expanduser()
PosixPath2('/home/username/sub/dir')
</pre> * os.**`link() <https://docs.python.org/3/library/os.html#os.link>`_**
<pre>
>>> Path2("source.txt").link(Path2("hardlinked.txt"))
</pre> * os.**`makedirs() <https://docs.python.org/3/library/os.html#os.makedirs>`_**
<pre>
>>> Path2("a", "new", "path").makedirs()
</pre> * os.**`utime() <https://docs.python.org/3/library/os.html#os.utime>`_**
<pre>
>>> mtime = 111111111 # UTC: 1973-07-10 00:11:51
>>> atime = 222222222 # UTC: 1977-01-16 01:23:42
>>> p.Path2("dir/or/file")
>>> p.utime(times=(atime, mtime))
>>> stat = p.stat()
>>> stat.st_atime
222222222
>>> stat.st_mtime
111111111
</pre> * os.**`scandir() <https://docs.python.org/3/library/os.html#os.scandir()>`_**
<pre>
>>> p=Path2("/foo/bar")
>>> for dir_item in p.scandir():
... print(dir_item)
...
<PosixDirEntry: 'filename'>
<PosixDirEntry: 'directory'>
<PosixDirEntry: '...'>
</pre> It's a generator that yields os.**`DirEntry <https://docs.python.org/3/library/os.html#os.DirEntry>`_** instances.
**scandir** is new in Python 3.5, but in Path2() is will fall-back to the external `scandir <https://pypi.python.org/pypi/scandir>`_ module.
You miss a method? Please, fork, implement, add tests and send a pull request! ;)
misc
====
Path2() hat the **.path** property, that is normally new in Python 3.4.5 and 3.5.2
So you can use it with older Python Version, too.
------------
DirEntryPath
------------
The `DirEntryPath`_ holds more cached information:
+----------------------------+-------------------------------------------------------------------------+
| *instance***.dir_entry** | os.DirEntry() instance |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.path** | str or bytes of the path, from: *os.DirEntry()***.path** |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.is_symlink | bool from *os.DirEntry()***.is_symlink()** |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.is_file | bool from *os.DirEntry()***.is_file(follow_symlinks=False)** |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.is_dir | bool from *os.DirEntry()***.is_dir(follow_symlinks=False)** |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.stat | bool from *os.DirEntry()***.stat(follow_symlinks=False)** |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.path_instance | **Path2()** instance |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.resolved_path | **Path2()** instance from **.resolve()** (If resolve errored: **None**) |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.resolve_error | The error Instance, if .resolve() failed. |
+----------------------------+-------------------------------------------------------------------------+
Create a instance by feeding a `os.DirEntry`_ instance, e.g.:
::
>>> from pathlib_revised import Path2, DirEntryPath
>>> src_path = Path2("foo/")
>>> for dir_entry in src_path.scandir():
... dir_entry_path = DirEntryPath(dir_entry)
... print(dir_entry_path.pformat())
*** <DirEntryPath foo/file1> :
path.......: 'foo/file1'
path instance..: PosixPath2('foo/file1')
resolved path..: PosixPath2('/home/bar/foo/file1')
resolve error..: None
different path.: True
is symlink.....: False
is file........: False
is dir.........: True
stat.size......: 38
*** <DirEntryPath foo/BrokenSymlink.ext> :
path.......: 'foo/BrokenSymlink.ext'
path instance..: PosixPath2('foo/BrokenSymlink.ext')
resolved path..: None
resolve error..: FileNotFoundError(2, 'No such file or directory')
different path.: True
is symlink.....: True
is file........: False
is dir.........: False
stat.size......: 15
*** <DirEntryPath foo/README.creole> :
path.......: 'foo/README.creole'
path instance..: PosixPath2('foo/README.creole')
resolved path..: PosixPath2('/home/bar/foo/README.creole')
resolve error..: None
different path.: True
is symlink.....: False
is file........: True
is dir.........: False
stat.size......: 4802
-------
History
-------
* 08.02.2016 - v0.1.0
* code cleanup + more tests
* move files form `PyHardLinkBackup <https://github.com/jedie/PyHardLinkBackup/tree/bb29eda6a0724c060f0e39773bdaecc325e9fea2>`_
-----
Links
-----
* `https://pypi.python.org/pypi/pathlib_revised/ <https://pypi.python.org/pypi/pathlib_revised/>`_
pathlib_revised
---------------
Expand the origin Python `pathlib <https://docs.python.org/3/library/pathlib.html>`_ module:
* work-a-round for Windows MAX_PATH limit, by adding ``\\?\`` path prefix
* add missing stuff, like: ``makedirs``, ``utime``, ``scandir`` etc.
There is also the class, called `DirEntryPath <https://github.com/jedie/pathlib_revised/blob/master/pathlib_revised/dir_entry_path.py>`_ that holds more cached information than `os.DirEntry <https://docs.python.org/3/library/os.html#os.DirEntry>`_
* python 3.4 or newer only
* Beta state
Please, try, fork and contribute! ;)
+--------------------------------------+-----------------------------------------------------------+
| |Build Status on travis-ci.org| | `travis-ci.org/jedie/pathlib_revised`_ |
+--------------------------------------+-----------------------------------------------------------+
| |Build Status on appveyor.com| | `ci.appveyor.com/project/jedie/pathlib_revised`_ |
+--------------------------------------+-----------------------------------------------------------+
| |Coverage Status on coveralls.io| | `coveralls.io/r/jedie/pathlib_revised`_ |
+--------------------------------------+-----------------------------------------------------------+
| |Requirements Status on requires.io| | `requires.io/github/jedie/pathlib_revised/requirements/`_ |
+--------------------------------------+-----------------------------------------------------------+
.. |Build Status on travis-ci.org| image:: https://travis-ci.org/jedie/pathlib_revised.svg
.. _travis-ci.org/jedie/pathlib_revised: https://travis-ci.org/jedie/pathlib_revised/
.. |Build Status on appveyor.com| image:: https://ci.appveyor.com/api/projects/status/py5sl38ql3xciafc?svg=true
.. _ci.appveyor.com/project/jedie/pathlib_revised: https://ci.appveyor.com/project/jedie/pathlib_revised/history
.. |Coverage Status on coveralls.io| image:: https://coveralls.io/repos/jedie/pathlib_revised/badge.svg
.. _coveralls.io/r/jedie/pathlib_revised: https://coveralls.io/r/jedie/pathlib_revised
.. |Requirements Status on requires.io| image:: https://requires.io/github/jedie/pathlib_revised/requirements.svg?branch=master
.. _requires.io/github/jedie/pathlib_revised/requirements/: https://requires.io/github/jedie/pathlib_revised/requirements/
Windows MAX_PATH
================
There is a limit in the Windows API: Path can't be longer than 259 characters (called: "MAX_PATH").
The work-a-round is to add the prefix ``\\?\`` to every absolute path, see:
* `https://msdn.microsoft.com/en-us/library/aa365247.aspx#maxpath <https://msdn.microsoft.com/en-us/library/aa365247.aspx#maxpath>`_
The **Path2()** class has the additional property **extended_path**:
::
>>> from pathlib_revised import Path2
>>> p=Path2("c:\foo\bar")
>>> p.extended_path
'\\?\c:\foo\bar'
All existing methods of **Path2()** will internally use **extended_path**, so that the **MAX_PATH** limit is not longer a problem.
**extended_path** exist also under Posix-Systems, but it's the same as **path**:
::
>>> p=Path2("/foo/bar")
>>> p.path
'/foo/bar'
>>> p.extended_path
'/foo/bar'
Additional methods
==================
* os.**`listdir() <https://docs.python.org/3/library/os.html#os.listdir>`_**
<pre>
>>> Path2("/").listdir()
['sbin', 'boot', 'tmp', 'sys', 'var', 'dev', 'usr', 'root', 'home', ..., 'initrd.img', 'vmlinuz']
</pre> * shutil.**`copyfile() <https://docs.python.org/3/library/shutil.html#shutil.copyfile>`_**
<pre>
>>> Path2("a_file.txt").copyfile(Path2("a_file_copy.txt"))
</pre> * os.path.**`expanduser() <https://docs.python.org/3/library/os.path.html#os.path.expanduser>`_**
<pre>
>>> p=Path2("~", "sub", "dir")
>>> p
PosixPath2('~/sub/dir')
>>> p.expanduser()
PosixPath2('/home/username/sub/dir')
</pre> * os.**`link() <https://docs.python.org/3/library/os.html#os.link>`_**
<pre>
>>> Path2("source.txt").link(Path2("hardlinked.txt"))
</pre> * os.**`makedirs() <https://docs.python.org/3/library/os.html#os.makedirs>`_**
<pre>
>>> Path2("a", "new", "path").makedirs()
</pre> * os.**`utime() <https://docs.python.org/3/library/os.html#os.utime>`_**
<pre>
>>> mtime = 111111111 # UTC: 1973-07-10 00:11:51
>>> atime = 222222222 # UTC: 1977-01-16 01:23:42
>>> p.Path2("dir/or/file")
>>> p.utime(times=(atime, mtime))
>>> stat = p.stat()
>>> stat.st_atime
222222222
>>> stat.st_mtime
111111111
</pre> * os.**`scandir() <https://docs.python.org/3/library/os.html#os.scandir()>`_**
<pre>
>>> p=Path2("/foo/bar")
>>> for dir_item in p.scandir():
... print(dir_item)
...
<PosixDirEntry: 'filename'>
<PosixDirEntry: 'directory'>
<PosixDirEntry: '...'>
</pre> It's a generator that yields os.**`DirEntry <https://docs.python.org/3/library/os.html#os.DirEntry>`_** instances.
**scandir** is new in Python 3.5, but in Path2() is will fall-back to the external `scandir <https://pypi.python.org/pypi/scandir>`_ module.
You miss a method? Please, fork, implement, add tests and send a pull request! ;)
misc
====
Path2() hat the **.path** property, that is normally new in Python 3.4.5 and 3.5.2
So you can use it with older Python Version, too.
------------
DirEntryPath
------------
The `DirEntryPath`_ holds more cached information:
+----------------------------+-------------------------------------------------------------------------+
| *instance***.dir_entry** | os.DirEntry() instance |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.path** | str or bytes of the path, from: *os.DirEntry()***.path** |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.is_symlink | bool from *os.DirEntry()***.is_symlink()** |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.is_file | bool from *os.DirEntry()***.is_file(follow_symlinks=False)** |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.is_dir | bool from *os.DirEntry()***.is_dir(follow_symlinks=False)** |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.stat | bool from *os.DirEntry()***.stat(follow_symlinks=False)** |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.path_instance | **Path2()** instance |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.resolved_path | **Path2()** instance from **.resolve()** (If resolve errored: **None**) |
+----------------------------+-------------------------------------------------------------------------+
| *instance***.resolve_error | The error Instance, if .resolve() failed. |
+----------------------------+-------------------------------------------------------------------------+
Create a instance by feeding a `os.DirEntry`_ instance, e.g.:
::
>>> from pathlib_revised import Path2, DirEntryPath
>>> src_path = Path2("foo/")
>>> for dir_entry in src_path.scandir():
... dir_entry_path = DirEntryPath(dir_entry)
... print(dir_entry_path.pformat())
*** <DirEntryPath foo/file1> :
path.......: 'foo/file1'
path instance..: PosixPath2('foo/file1')
resolved path..: PosixPath2('/home/bar/foo/file1')
resolve error..: None
different path.: True
is symlink.....: False
is file........: False
is dir.........: True
stat.size......: 38
*** <DirEntryPath foo/BrokenSymlink.ext> :
path.......: 'foo/BrokenSymlink.ext'
path instance..: PosixPath2('foo/BrokenSymlink.ext')
resolved path..: None
resolve error..: FileNotFoundError(2, 'No such file or directory')
different path.: True
is symlink.....: True
is file........: False
is dir.........: False
stat.size......: 15
*** <DirEntryPath foo/README.creole> :
path.......: 'foo/README.creole'
path instance..: PosixPath2('foo/README.creole')
resolved path..: PosixPath2('/home/bar/foo/README.creole')
resolve error..: None
different path.: True
is symlink.....: False
is file........: True
is dir.........: False
stat.size......: 4802
-------
History
-------
* 08.02.2016 - v0.1.0
* code cleanup + more tests
* move files form `PyHardLinkBackup <https://github.com/jedie/PyHardLinkBackup/tree/bb29eda6a0724c060f0e39773bdaecc325e9fea2>`_
-----
Links
-----
* `https://pypi.python.org/pypi/pathlib_revised/ <https://pypi.python.org/pypi/pathlib_revised/>`_
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
pathlib_revised-0.1.0.tar.gz
(13.1 kB
view details)
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
pathlib_revised-0.1.0-py3.4.egg
(11.5 kB
view details)
File details
Details for the file pathlib_revised-0.1.0.tar.gz.
File metadata
- Download URL: pathlib_revised-0.1.0.tar.gz
- Upload date:
- Size: 13.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c3528dbdd66cd1582242319648c921ff9552bec789c970ff1b628a66df8824c
|
|
| MD5 |
43829dc4ee27171c4fc0ba89b8c00134
|
|
| BLAKE2b-256 |
789e1fa9eb70f60e5808af185004ac98d417a5e52b979ff354f228fb4544a52f
|
File details
Details for the file pathlib_revised-0.1.0-py3.4.egg.
File metadata
- Download URL: pathlib_revised-0.1.0-py3.4.egg
- Upload date:
- Size: 11.5 kB
- Tags: Egg
- Uploaded using Trusted Publishing? No
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d38bedcd2077950043615929b021aae905b6163de66f678656bee2c8b8ea1215
|
|
| MD5 |
5dc00a6d2b48927c97874d217facf410
|
|
| BLAKE2b-256 |
20a231d98d5770f2f476722bc08ff2b37eb2429bc1a385e5dba7a9caacccb9d0
|
File details
Details for the file pathlib_revised-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pathlib_revised-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd59a14410b682c1d6ed0210ada131469b0a51363d4261008cbf595a67118cd9
|
|
| MD5 |
e6a77b92fc97187a4c0258e32d70975f
|
|
| BLAKE2b-256 |
6d85900c47c9ea8c0a9a972fcdbda859877cfa047157efdf566dc0300e84ac2b
|