Change file to read-only mode in Python

For this you use os.chmod

import os
from stat import S_IREAD, S_IRGRP, S_IROTH

filename = "path/to/file"
os.chmod(filename, S_IREAD|S_IRGRP|S_IROTH)

Note that this assumes you have appropriate permissions, and that you want more than just the owner to be able to read the file. Remove S_IROTH and S_IRGRP as appropriate if that's not the case.

UPDATE

If you need to make the file writable again, simply call os.chmod as so:

from stat import S_IWUSR # Need to add this import to the ones above

os.chmod(filename, S_IWUSR|S_IREAD) # This makes the file read/write for the owner

Simply call this before you open the file for writing, then call the first form to make it read-only again after you're done.


Using pathlib.Path, for modern python3, use path.chmod(mode: int)

The octal mode could be specified like 0o444 (read only). See this for more chmod mode options.

Note, if it is to apply to the symlink itself, see path.lchmod. For path.chmod, after 3.10, there's now a follow_symlinks = True parameter as well.

On windows, this may not be sufficient for anything but twiddling the read-only flag. See other SO posts [1].


This solution preserves previous permission of the file, acting like command chmod -w FILE

import os
import stat

filename = "path/to/file"
mode = os.stat(filename).st_mode
ro_mask = 0o777 ^ (stat.S_IWRITE | stat.S_IWGRP | stat.S_IWOTH)
os.chmod(filename, mode & ro_mask)    

Tags:

Python

File Io