How to Remove Files in Python (rm File)

Mateen Kiani

Mateen Kiani

Published on Sat Aug 02 2025·4 min read

how-to-remove-files-in-python-(rm-file)

Introduction

Deleting files is a common task for any developer working with Python. We often focus on reading, writing, or moving files, but handling file removal gracefully is just as critical. What happens when you try to delete a file that doesn’t exist or lacks permissions? Can you avoid leaving behind empty directories or accidentally remove the wrong data?

By understanding the different methods Python offers—such as os.remove, pathlib.Path.unlink, and shutil.rmtree—you can build safer scripts that handle edge cases. Let's explore how to remove files (the “rm file” task) in a reliable way and keep your applications error-resistant.

Checking If File Exists

Before you delete, always verify the file’s presence. This prevents uncaught exceptions and makes your code more robust. You can use the built-in os.path or the newer pathlib module:

import os
from pathlib import Path
file_path = 'data/output.txt'
# Using os.path
if os.path.exists(file_path):
os.remove(file_path)
else:
print('File not found.')
# Using pathlib
path = Path(file_path)
if path.exists():
path.unlink()
else:
print('File not found.')

Tip: If you need to list directory contents before deletion, check out listing directory contents in Python for examples.

Removing with os.remove

The simplest way to delete a file in Python is os.remove. It acts like the Unix rm command and throws an OSError if something goes wrong:

import os
try:
os.remove('temp/log.txt')
print('Deleted log.txt successfully.')
except OSError as e:
print(f'Error deleting file: {e}')

Key points:

  • os.remove(path) and os.unlink(path) are identical.
  • Errors include missing files or permission issues.
  • Wrap calls in try/except to handle failures.

Removing with pathlib.Path.unlink

Since Python 3.4, pathlib offers an object-oriented approach. Use Path.unlink to delete a file:

from pathlib import Path
path = Path('cache/temp.bin')
try:
path.unlink()
print('cache/temp.bin removed.')
except FileNotFoundError:
print('File already gone.')
except PermissionError:
print('Permission denied.')

Why use pathlib?

  • Clearer code expressing “this is a path.”
  • Methods like is_file(), exists(), and stat() help you check before deleting.
  • Chain operations easily:

    path.parent.mkdir(exist_ok=True)
    # ... later
    path.unlink()

Deleting Directories Recursively

When you need to remove a directory and its contents, turn to shutil.rmtree:

import shutil
try:
shutil.rmtree('old_build')
print('old_build directory removed.')
except FileNotFoundError:
print('Directory not found.')
except Exception as e:
print(f'Failed to delete directory: {e}')

Useful options:

  • shutil.rmtree(path, ignore_errors=True) skips errors silently.
  • Use onerror callback to handle specific failures.

Warning: This action is irreversible. Double-check paths to avoid data loss.

Handling Errors Safely

Robust error handling prevents crashes and unexpected data loss. Consider these practices:

  1. Catch specific exceptions like FileNotFoundError, PermissionError, or OSError.
  2. Log errors rather than printing to console.
  3. Use dry-run flags in scripts to show what would be deleted.
def safe_remove(path, dry_run=False):
from pathlib import Path
p = Path(path)
if dry_run:
print(f'[Dry Run] Would remove: {p}')
return
try:
p.unlink()
print(f'Removed: {p}')
except FileNotFoundError:
print(f'No such file: {p}')
except PermissionError:
print(f'Cannot delete: {p}')

For more on crafting tailored error messages, see raising exceptions with custom messages in Python.

Best Practices and Tips

  • Confirm paths before deleting, especially if using wildcards or user input.
  • Backup critical data. Prefer moving files to a trash folder first.
  • Use atomic operations or transaction logs when deleting in bulk.
  • Integrate logging so you have an audit trail of removed files.

Consider packaging your removal logic into a utility function or class to reuse across projects. This centralizes your error handling and dry-run features.

Conclusion

Removing files in Python is straightforward, but doing it safely requires planning. By checking for existence, choosing the right method (os.remove, pathlib.Path.unlink, or shutil.rmtree), and handling errors with care, you can prevent crashes and accidental data loss. Remember to integrate logging, use dry-run modes, and confirm critical paths. With these practices in place, your file-cleanup routines will be both reliable and maintainable.


Mateen Kiani
Mateen Kiani
kiani.mateen012@gmail.com
I am a passionate Full stack developer with around 4 years of experience in MERN stack development and 1 year experience in blockchain application development. I have completed several projects in MERN stack, Nextjs and blockchain, including some NFT marketplaces. I have vast experience in Node js, Express, React and Redux.