Skip to main content

How to Solve "OSError: [Errno 30] Read-only file system" in Python

The OSError: [Errno 30] Read-only file system error in Python indicates that you're trying to write to a file or directory where you don't have write permissions, or that the file system itself is mounted as read-only.

This guide explains the common causes of this error and provides solutions for various environments, including general troubleshooting, Kaggle, AWS Lambda, and AzureML.

Understanding the Error: Permissions and Read-Only Filesystems

This error occurs when your Python code attempts a write operation (creating a file, writing to an existing file, creating a directory, etc.) on a file system location that is:

  • Read-only: The entire file system or the specific directory might be mounted as read-only. This is common for system directories, mounted network shares, or temporary environments like those in Kaggle or cloud functions.
  • Permission Denied: Your user account might not have the necessary write permissions to the target file or directory, even if the filesystem itself is writable.

General Troubleshooting

Before looking at environment-specific solutions, try these general troubleshooting steps:

Check File/Directory Permissions

  • Linux/macOS: Use the ls -l command to view permissions:

    ls -l /path/to/your/file_or_directory

    The output will look something like this:

    -rw-r--r-- 1 user group 1234 Oct 27 15:00 myfile.txt
    drwxr-xr-x 2 user group 4096 Oct 27 15:01 mydirectory
    • The first character indicates the file type (- for a regular file, d for a directory, l for a symbolic link, etc.).
    • The next nine characters represent the permissions: rwxr-xr-x. These are three sets of three:
      • rwx: Owner permissions (read, write, execute)
      • r-x: Group permissions (read, execute; no write)
      • r-x: Others permissions (read, execute; no write)
    • In the above example, mydirectory is writable by the owner, but not by the group or others. myfile.txt is readable and writable by owner, but read-only to others.

    If you need to change permissions (and have the necessary privileges), use chmod:

    • To make all files in a directory writable by owner use chmod -R u+w /path/to/your/directory.
    • To make all files and folders recursively writable by anyone (use this with extreme caution):
    chmod -R 777 /path/to/your/directory
    • To give read, write and execute rights to user, and only read and execute access to group and other users:
    chmod -R 755 /path/to/your/directory
  • Windows: Right-click the file or folder, select "Properties," and go to the "Security" tab. Check the permissions for your user account.

Verify the Path

Double-check that the file path you're using in your Python code is exactly correct:

  • Typos: Even a small typo can lead to this error.
  • Absolute vs. Relative Paths: Be sure you understand whether you're using an absolute path (starting from the root directory, e.g., /home/user/data.txt) or a relative path (relative to your script's current working directory, e.g., data.txt).
  • Directory Existence: Ensure that all directories in the path exist. If you're trying to create a file in a non-existent directory, you'll get an error (which might be a "Read-only file system" error, or a "No such file or directory" error, depending on where the missing directory is).
import os

path_to_directory = '/path/that/might/not/exist'
print(os.path.isdir(path_to_directory)) # Check if the directory exists

Use a Writable Directory

If you're unsure where you have write permissions, or if you're in a restricted environment, use a directory specifically designated for temporary files:

import tempfile
import os

# Create a temporary file (automatically cleaned up)
with tempfile.TemporaryDirectory() as temp_dir:
file_path = os.path.join(temp_dir, "my_file.txt")
with open(file_path, "w") as f:
f.write("This will work!")

# OR, create a file in a known writable location (e.g., /tmp on Linux/macOS)
with open("/tmp/my_file.txt", "w") as f: # /tmp is usually writable
f.write("This will likely work on Linux/macOS")

# On Windows, use a directory you *know* you can write to:
with open(r"C:\Users\YourUser\Documents\my_file.txt", "w") as f:
f.write("This will likely work on Windows")
  • tempfile.TemporaryDirectory(): Creates a temporary directory that's automatically deleted when the with block exits. This is the safest option for temporary files.
  • /tmp (Linux/macOS): This directory is usually writable by all users, but it's not guaranteed. It's generally a good place for temporary files.
  • C:\Users\YourUser\Documents: On Windows, your user's Documents folder is usually writable. Replace YourUser with your actual username. Always use raw strings (r"...") or double backslashes ("C:\\Users\\...") for Windows paths. Or, better yet, use forward slashes, or pathlib.

Specific Environments

Kaggle

  • Read-Only Input: The /kaggle/input directory in Kaggle kernels is read-only. You can not write to it.
  • Writable Directory: Use /kaggle/working for any output files you need to create.
# Correct: Writing to the working directory
with open('/kaggle/working/output.txt', 'w') as f:
f.write('This will work on Kaggle.')

AWS Lambda

  • Read-Only Filesystem: The AWS Lambda execution environment's filesystem is read-only, except for the /tmp directory.
  • Writable Directory: Use /tmp for any temporary files your Lambda function needs to create.
# Correct: Writing to /tmp on AWS Lambda
with open('/tmp/my_temp_file.txt', 'w') as f:
f.write('This will work on AWS Lambda.')

AzureML

  • Writable Directory: When running pipelines in AzureML, you might encounter read-only file system errors. Prefixing your paths with /tmp/ might resolve this.
key = "your_key"
# ... other code ...
with open("/tmp/" + key, "w") as f: # Add /tmp/ prefix
f.write("your data")
  • This example uses a /tmp directory to store temporary files.

Conclusion

The OSError: [Errno 30] Read-only file system error in Python is almost always related to file/directory permissions or attempting to write to a read-only location.

  • Carefully check your paths, permissions, and the specific environment you're working in (especially cloud platforms like Kaggle, AWS Lambda, and AzureML).
  • Using tempfile and writing to known writable directories (like /tmp where appropriate) are good strategies for avoiding this error.
  • Always use the with statement to automatically close files, and double-check paths.