Python os.truncate Function
Last modified April 11, 2025
This comprehensive guide explores Python's os.truncate function,
which modifies file size by truncating or extending it. We'll cover usage
scenarios, permission requirements, and practical examples.
Basic Definitions
The os.truncate function changes the size of a file to the
specified length. If the file is extended, new bytes are filled with zeros.
Key parameters: path (file to modify), length (new size in bytes). Requires write permission on the file. Works on regular files, not directories.
Truncating a File to Smaller Size
The most common use of os.truncate is reducing file size by
discarding content beyond the specified length. This example demonstrates
basic truncation.
import os
# Create a sample file
file_path = "data.txt"
with open(file_path, "w") as f:
f.write("This is some sample text for truncation demonstration.")
# Check original size
original_size = os.path.getsize(file_path)
print(f"Original size: {original_size} bytes")
# Truncate to 20 bytes
os.truncate(file_path, 20)
new_size = os.path.getsize(file_path)
print(f"New size: {new_size} bytes")
# Verify content
with open(file_path) as f:
print(f"Content: '{f.read()}'")
This creates a file, then truncates it to 20 bytes. The remaining content will be the first 20 bytes of the original text.
Note that truncation happens immediately at the filesystem level, without needing to reopen the file.
Extending a File with Zeros
When specifying a length larger than the current file size, os.truncate
extends the file by padding with null bytes. This example shows file extension.
import os
file_path = "empty.dat"
# Create empty file
with open(file_path, "w"):
pass
# Extend file to 1KB (1024 bytes)
os.truncate(file_path, 1024)
size = os.path.getsize(file_path)
print(f"File size after extension: {size} bytes")
# Verify content is null bytes
with open(file_path, "rb") as f:
content = f.read(16) # Read first 16 bytes
print(f"First 16 bytes: {content}")
This creates an empty file, then extends it to 1024 bytes. The new space is filled with zeros. Binary mode is used to read the null bytes.
File extension is useful for preallocating space or creating sparse files.
Truncating Open File Descriptors
os.ftruncate works similarly but operates on an open file descriptor
instead of a path. This example shows both functions for comparison.
import os
file_path = "log.txt"
# Using os.truncate with path
with open(file_path, "w") as f:
f.write("Initial content for truncation test")
os.truncate(file_path, 10)
print(f"After path truncate: {os.path.getsize(file_path)} bytes")
# Using os.ftruncate with file descriptor
with open(file_path, "r+") as f:
fd = f.fileno()
os.ftruncate(fd, 5)
print(f"After fd truncate: {os.path.getsize(file_path)} bytes")
Both functions achieve the same result but take different parameters.
os.ftruncate requires an open file descriptor.
The file must be opened in a mode that allows writing for os.ftruncate.
Error Handling
os.truncate can raise various exceptions. This example demonstrates
proper error handling for common scenarios.
import os
import errno
file_path = "protected.txt"
try:
# Attempt to truncate a non-existent file
os.truncate("nonexistent.txt", 100)
except FileNotFoundError:
print("Error: File not found")
try:
# Attempt to truncate without permissions
os.truncate("/root/protected.txt", 100)
except PermissionError:
print("Error: Permission denied")
try:
# Attempt to truncate a directory
os.truncate("/tmp", 100)
except IsADirectoryError:
print("Error: Cannot truncate a directory")
try:
# Invalid length
os.truncate(file_path, -1)
except OSError as e:
if e.errno == errno.EINVAL:
print("Error: Invalid length specified")
This shows handling for file not found, permission issues, directory truncation, and invalid length parameters. Each case raises a different exception.
Always validate inputs and handle potential errors when working with filesystem operations.
Combining with Other File Operations
os.truncate can be combined with other file operations for more
complex workflows. This example shows integration with file reading.
import os
file_path = "data.bin"
# Create binary file with some data
with open(file_path, "wb") as f:
f.write(b"\x01\x02\x03\x04\x05\x06\x07\x08")
# Truncate to remove last 4 bytes
os.truncate(file_path, 4)
# Read remaining content
with open(file_path, "rb") as f:
content = f.read()
print(f"Remaining bytes: {content}")
print(f"Size after truncate: {len(content)} bytes")
# Extend file and verify
os.truncate(file_path, 8)
with open(file_path, "rb") as f:
content = f.read()
print(f"Extended bytes: {content}")
print(f"Size after extension: {len(content)} bytes")
This creates a binary file, truncates it, then extends it while verifying the content at each step. The null bytes added during extension are visible.
Binary mode is essential when working with non-text data or examining the actual bytes added during extension.
Performance Considerations
This example benchmarks os.truncate against alternative methods
of file size modification to demonstrate performance characteristics.
import os
import timeit
file_path = "large_file.bin"
size_mb = 10 # 10MB file
test_size = 5 # Truncate to 5MB
def create_large_file():
with open(file_path, "wb") as f:
f.seek(size_mb * 1024 * 1024 - 1)
f.write(b"\0")
def method_truncate():
os.truncate(file_path, test_size * 1024 * 1024)
def method_write():
with open(file_path, "r+") as f:
f.truncate(test_size * 1024 * 1024)
# Setup
create_large_file()
# Benchmark
truncate_time = timeit.timeit(method_truncate, number=100)
write_time = timeit.timeit(method_write, number=100)
print(f"os.truncate average: {truncate_time/100:.6f}s")
print(f"file.truncate average: {write_time/100:.6f}s")
# Cleanup
os.remove(file_path)
This creates a large file, then compares truncation methods. os.truncate
is generally faster as it operates at the filesystem level.
The performance difference becomes more significant with larger files and frequent truncation operations.
Security Considerations
- Permission requirements: Write permission on the file is required
- Data loss: Truncation permanently removes file content
- Race conditions: File may change between size check and truncation
- Symbolic links: Follows symlinks by default (use os.path.realpath)
- Cross-platform: Behavior consistent across Unix and Windows
Best Practices
- Backup important data: Before performing destructive operations
- Check file type: Verify it's a regular file before truncating
- Handle errors: Implement proper exception handling
- Document size changes: Log truncation operations for audit
- Consider alternatives: For some cases, file.truncate() may be better
Source References
Author
List all Python tutorials.