FileExistsError — File Already Exists Fix

A FileExistsError is raised when you try to create a file or directory that already exists and the operation doesn’t allow overwriting. It’s a subclass of OSError.

Description

FileExistsError commonly occurs when creating directories with os.mkdir() or os.makedirs() without the exist_ok parameter, or when creating files with flags that require a new file (like os.open() with O_CREAT and O_EXCL).

Common scenarios:

  • Creating a directory that existsos.mkdir("existing_dir").
  • Creating nested directoriesos.makedirs() on a partially existing path.
  • Atomic file creationos.open() with O_CREAT | O_EXCL on existing file.
  • Renaming to an existing nameos.rename() to a path that already exists.
  • Re-running scripts — scripts that create temp directories without checking.

Common Causes

import os

# Cause 1: os.mkdir on existing directory
os.mkdir("existing_directory")  # FileExistsError

# Cause 2: os.makedirs on partially existing path
os.makedirs("/tmp/existing/subdir")  # FileExistsError if /tmp/existing exists

# Cause 3: Creating file that already exists
fd = os.open("existing_file.txt", os.O_CREAT | os.O_EXCL | os.O_WRONLY)
os.close(fd)  # FileExistsError

# Cause 4: Renaming to an existing path
os.rename("source.txt", "existing_file.txt")  # FileExistsError

# Cause 5: Re-running a script that creates directories
import os
os.mkdir("temp_dir")  # First run succeeds
os.mkdir("temp_dir")  # Second run: FileExistsError

Solutions

Fix 1: Use exist_ok parameter for directories

import os

# Wrong — fails if directory exists
os.makedirs("data/output")

# Correct — silently succeeds if directory exists
os.makedirs("data/output", exist_ok=True)

Fix 2: Check if path exists before creating

import os
from pathlib import Path

# Wrong — assumes path doesn't exist
os.mkdir("output_dir")

# Correct — check first
dir_path = Path("output_dir")
if not dir_path.exists():
    dir_path.mkdir()
else:
    print(f"Directory already exists: {dir_path}")

Fix 3: Use try/except for atomic creation

import os

# Wrong — race condition between check and create
if not os.path.exists("file.txt"):
    with open("file.txt", "w") as f:
        f.write("data")

# Correct — atomic creation
try:
    fd = os.open("file.txt", os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o644)
    os.write(fd, b"data")
    os.close(fd)
except FileExistsError:
    print("File already exists — skipping creation")

Fix 4: Use pathlib for cleaner file operations

from pathlib import Path

# Wrong — raw os operations
if not os.path.exists("output"):
    os.makedirs("output")

# Correct — pathlib handles it cleanly
output_dir = Path("output")
output_dir.mkdir(exist_ok=True)

# For files, use a different approach
output_file = output_dir / "result.txt"
if not output_file.exists():
    output_file.write_text("data")
else:
    print(f"File already exists: {output_file}")

Fix 5: Handle renaming with overwrite option

import os
from pathlib import Path

# Wrong — fails if destination exists
os.rename("source.txt", "dest.txt")

# Correct — remove destination first or use shutil
import shutil
dest = Path("dest.txt")
if dest.exists():
    dest.unlink()  # Remove existing file
os.rename("source.txt", "dest.txt")

# Or use shutil which can overwrite
shutil.move("source.txt", "dest.txt")  # Overwrites if exists

Comments