fs
Overview
The fs module provides filesystem operations through the Path object. All functionality is auto-loaded — no imports are needed.
The primary API is the Path object, created with fs.path() or the path() global alias. A set of global alias functions provide convenient shorthand for common Path operations.
Path Object
The Path object is the primary API for all filesystem operations. Create one with fs.path() or the path() global alias:
p = fs.path("/etc/hosts")
p = path("/etc/hosts") # equivalent, using global alias
Properties
| Property |
Type |
Description |
name |
string |
Filename with extension ("report.md") |
parent |
Path |
Parent directory as a Path |
stem |
string |
Filename without extension ("report") |
suffix |
string |
File extension (".md") |
string |
string |
Full path as string |
parts |
tuple |
Path components as a tuple |
Path Building
| Method |
Returns |
Description |
p.join(other) |
Path |
Join with another path component |
p.with_name(name) |
Path |
Replace the filename |
p.with_suffix(suffix) |
Path |
Replace the extension |
p.resolve() |
Path |
Resolve to absolute path |
p.clean() |
Path |
Return cleaned path (resolves . and ..) |
p.is_absolute() |
bool |
Check if path is absolute |
p.is_relative_to(base) |
bool |
Check if path is relative to base |
p.relative_to(base) |
Path |
Get relative path from base |
p.match(pattern) |
bool |
Test against glob pattern |
p.expanduser() |
Path |
Expand ~ to home directory |
Path Separator
The / operator joins path components, similar to Python's pathlib:
p = path("/home/user")
config = p / "config" / "app.yaml"
print(config.string) # /home/user/config/app.yaml
File Info
| Method |
Returns |
Description |
p.exists() |
bool |
Check if path exists on disk |
p.is_file() |
bool |
Check if path is a regular file |
p.is_dir() |
bool |
Check if path is a directory |
p.is_symlink() |
bool |
Check if path is a symbolic link |
p.stat() |
dict |
Get file metadata |
p.owner() |
string |
Get file owner name |
p.group() |
string |
Get file group name |
File I/O
| Method |
Returns |
Description |
p.read_text() |
string |
Read file as text |
p.read_bytes() |
bytes |
Read file as bytes |
p.write_text(content) |
None |
Write text to file |
p.write_bytes(data) |
None |
Write bytes to file |
p.append_text(content) |
None |
Append text to file |
p.append_bytes(data) |
None |
Append bytes to file |
File Operations
| Method |
Returns |
Description |
p.touch() |
None |
Create file or update mtime |
p.mkdir() |
None |
Create directory (and parents) |
p.remove() |
None |
Remove file or directory |
p.rename(target) |
Path |
Rename/move to target |
p.copy_to(target) |
Path |
Copy file to target path |
p.move_to(target) |
Path |
Move file/directory to target |
p.truncate(size) |
None |
Truncate file to given size |
p.chmod(mode) |
None |
Change permissions |
p.chown(uid=-1, gid=-1) |
None |
Change file ownership |
p.symlink_to(target) |
None |
Create symlink pointing to target |
p.readlink() |
Path |
Read symlink target |
p.hardlink_to(target) |
None |
Create hard link at this path pointing to target |
Directory
| Method |
Returns |
Description |
p.listdir() |
list[Path] |
List directory entries as Paths |
p.glob(pattern) |
list[Path] |
Glob within this directory |
p.walk() |
list[tuple] |
Recursive directory traversal (Path, dirs, files) |
p.disk_usage() |
dict |
Disk space info with total, used, free |
Examples
p = path("/var/log/app")
# Navigate
parent = p.parent # Path(/var/log)
child = p / "errors" / "today.log" # Path(/var/log/app/errors/today.log)
# Query properties
print(child.name) # today.log
print(child.stem) # today
print(child.suffix) # .log
print(child.parts) # ("/", "var", "log", "app", "errors", "today.log")
# Modify path
renamed = child.with_name("yesterday.log")
different_ext = child.with_suffix(".txt")
# Read and iterate
if p.is_dir():
for entry in p.listdir():
if entry.is_file() and entry.match("*.log"):
content = entry.read_text()
print(entry.name, ":", len(content), "bytes")
# Write and append
output = path("/tmp/report.txt")
output.write_text("Summary\n")
output.append_text("Details\n")
# File metadata
info = path("data.bin").stat()
print("Size:", info["size"])
# Directory operations
tmp = path("/tmp/myapp/logs")
tmp.mkdir()
for entry in tmp.parent.listdir():
print(entry.name)
# Glob for files
for f in path("src").glob("**/*.go"):
print(f.string)
Global Aliases
These top-level functions are convenient shorthand for common Path methods, available without any module prefix:
| Function |
Returns |
Description |
path(p) |
Path |
Create a Path object |
read_text(p) |
string |
Read file as text. Alias for path(p).read_text() |
read_bytes(p) |
bytes |
Read file as bytes. Alias for path(p).read_bytes() |
write_text(p, content) |
None |
Write text to file. Alias for path(p).write_text(content) |
write_bytes(p, data) |
None |
Write bytes to file. Alias for path(p).write_bytes(data) |
exists(p) |
bool |
Check if path exists. Alias for path(p).exists() |
glob(pattern) |
list[string] |
Find paths matching a glob pattern |
# Quick file I/O with global aliases
config = read_text("/etc/myapp/config.yaml")
write_text("/tmp/output.txt", "Hello, World!\n")
if exists("/tmp/output.txt"):
print("File written successfully")
for f in glob("src/**/*.go"):
print(f)
The try_ Pattern
All I/O methods on Path support try_ variants that return a Result instead of raising an error:
result = path("/etc/missing").try_read_text()
if result.ok:
print(result.value)
else:
print("Error:", result.error)