betterpath, or "bp", is an adaptation of the classic Twisted FilePath
type
and interface. bp provides a simple, robust, well-tested object abstraction
over file paths, generalizing the concept of file paths beyond filesystems.
bp exposes an interface, bp.abstract.IFilePath
, for file paths, and
provides the following concrete implementations:
bp.filepath.FilePath
, for the root filesystembp.zippath.ZipPath
, for ZIP archivesbp.memory.MemoryPath
, for in-memory temporary filesystems
In addition, there are combining abstract file paths which can be wrapped around other file paths:
bp.readonly.ReadOnlyPath
, for read-only filesystems
API documentation is available at http://betterpath.rtfd.org/.
The venerable champ, os.path
has been the cause of (and solution to) most
of Python's path problems over the years.
- In the standard library
- Unsafe
- Verbose
- Operates on strs
- No interfaces or ABCs for functionality
- Only covers the root filesystem
pathlib hopes to carve a path towards greatness through PEP 428.
- Convenient
__div__()
overloading
- No interfaces or ABCs for functionality
- Only covers the root filesystem
def save(base, fragments, data): # `fragments` could contain unsafe paths! if ".." in fragments or "." in fragments: raise ValueError("Unsafe paths!") path = os.path.join(os.path.abspath(base), os.sep.join(fragments)) # Alternatively: path = os.path.join(os.path.abspath(base), *fragments) # I hope that this doesn't fail mid-write! Also, did the directories # exist? I think so, yes. with open(path, "wb") as handle: handle.write(data)
def save(base, fragments, data): path = base.descendant(fragments) path.parent().makeDirs() path.setContent(data)
- Initial release