Skip to main content

aiopathlib: Pathlib support for asyncio

image image image image Mypy coverage Ruff

If you are not using aiofiles, anyio.Path is another choice:

from datetime import datetime
from anyio import Path  # pip install anyio

filepath = Path(__file__)
another = filepath.parent / 'sub_dirpath' / 'filename.ext'

if await another.exists():
    content = await another.read_bytes()
elif not await another.parent.exists():
    await another.parent.mkdir(parents=True)
else:
    await another.write_bytes(b'1')

# glob/stat/remove
async for p in filepath.parent.glob('*'):
    if await p.is_file():
        stat = await p.stat()
        create_time = datetime.fromtimestamp(stat.st_ctime)
        update_time = datetime.fromtimestamp(stat.st_mtime)
        await p.unlink()  # remove file
        print(f'{p} created at: {create_time}, modified at: {update_time}, removed at: {datetime.now()}')

See more at: https://github.com/agronholm/anyio


aiopathlib is written in Python, for handling local disk files in asyncio applications.

Base on aiofiles and just like pathlib, but use await.

with open('filename', 'w') as fp:
    fp.write('{"msg":"My file contents"}')

apath = aiopathlib.AsyncPath('filename')
text = await apath.read_text()
print(repr(text))
# '{"msg":"My file contents"}'

content = await apath.read_bytes()
print(content)
# b'{"msg":"My file contents"}'

data = await apath.read_json()
print(data)
# {"msg": "My file contents"}

Asynchronous interface to create folder.

from aiopathlib import AsyncPath

apath = AsyncPath('dirname/subpath')
if not await apath.exists():
    await apath.mkdir(parents=True)

Features

  • a file API very similar to Python's standard package pathlib, blocking API
  • support for buffered and unbuffered binary files, and buffered text files
  • support for async/await (:PEP:492) constructs

Installation

To install aiopathlib, simply:

$ pip install aiopathlib

Usage

These functions are awaitable

  • read_text
  • read_bytes
  • read_json
  • write_text
  • write_bytes
  • write_json
  • mkdir
  • touch
  • exists
  • rename
  • unlink
  • rmdir
  • remove
  • stat
  • lstat
  • is_file
  • is_dir
  • is_symlink
  • is_fifo
  • is_mount
  • is_block_device
  • is_char_device
  • is_socket

Example

Some common using cases:

from pashlib import Path
from aiopathlib import AsyncPath

filename = 'test.json'
ap = AsyncPath(filename)
p = Path(filename)
assert (await ap.exists()) == p.exists() == False
await ap.touch()  # Create a empty file
assert (await ap.is_file()) == p.is_file() == True
assert (await ap.is_dir()) == p.is_dir() == False
assert (await ap.is_symlink()) == p.is_symlink() == False
for func in ('is_fifo', 'is_mount', 'is_block_device', 'is_char_device', 'is_socket'):
    assert (await getattr(ap, func)()) == getattr(p, func)()
d = {'key': 'value'}
await ap.write_json(d)  # == p.write_text(json.dumps(d))
assert (await ap.read_json()) == d  # == json.loads(p.read_text())
assert (await ap.read_bytes()) == p.read_bytes()  # b'{"key": "value"}'
assert (await ap.stat()) == p.stat()
assert (await ap.lstat()) == p.lstat()
ap = await ap.rename('test_dir')  # == AsyncPath(p.rename('test_dir'))
await ap.remove()  # == await ap.unlink() == p.unlink()
await ap.mkdir()  # == p.mkdir()
await ap.resolve() # == AsyncPath(p.resolve())

# Synchronization functions
[Path(i) for i in ap.glob('*')] == list(p.glob('*'))
[Path(i) for i in ap.rglob('*')] == list(p.rglob('*'))
ap / 'filename' == ap.joinpath('filename') == AsyncPath(f'{ap}/filename')
str(AsyncPath('string-or-Path-or-AsyncPath')) == str(Path('string-or-Path-or-AsyncPath'))
ap.stem == p.stem
ap.suffix == p.suffix
Path(ap.with_name('xxx')) == p.with_name('xxx')
Path(ap.parent) == p.parent
...

History

See the CHANGELOG.md file for details.

Contributing

Contributions are very welcome.

Release files for aiopathlib 0.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aiopathlib 0.7.0
File Size Uploaded
aiopathlib-0.7.0.tar.gz 9.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aiopathlib 0.7.0
File Interpreter ABI Platform
aiopathlib-0.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 16.3 kB

Release files / aiopathlib-0.7.0.tar.gz

Download URL aiopathlib-0.7.0.tar.gz
Size 9.8 kB
Tags Source
SHA-256 checksum
How to use checksums
476e4720119a6b199b429cabe62fcdce0751e9063679ac8c6ff6cf09612ca32f
BLAKE2b-256 checksum
How to use checksums
3b84de5f14b670d6bd27827bf8fd09b09bda0799cbaf3fedc8f9b87be2e17561
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / aiopathlib-0.7.0-py3-none-any.whl

Download URL aiopathlib-0.7.0-py3-none-any.whl
Size 6.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
18085fee4795e75fc4e68392b45c9efbec6d1da7c906fc414999542bd8a27884
BLAKE2b-256 checksum
How to use checksums
238bce47b0ffef954a457c46bff4c445f7e3bc47bcbfc52d6cb11abf7128641d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.7.0 This release

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page