24

I am writing a data processing code, in which I create a new file, write processed data in to this file and close. But the file has to be closed in read-only mode, so that it would not be accidentally modified. Can this be done in Python?

5 Answers5

36

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.

aruisdante
  • 8,875
  • 2
  • 30
  • 37
  • And how do I change it to write when I run the program. I want to change it to write when the program runs and when it exits it should be changed to read-only mode. –  Feb 13 '15 at 05:56
  • 1
    Ah, you didn't specify that in the original question. I'll update – aruisdante Feb 13 '15 at 06:11
  • Does not work on Windows. Even if this article says it should https://docs.python.org/2/library/os.html#os.chmod – Shtefan Apr 09 '23 at 05:25
5

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)    
Erik Aronesty
  • 11,620
  • 5
  • 64
  • 44
Tristan
  • 126
  • 1
  • 5
4

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].

JWCS
  • 1,120
  • 1
  • 7
  • 17
-2

For Windows OS maybe to try something like this:

import os

filename = open("file_name.txt", "w")
filename.write("my text")
filename.close()
os.system("attrib +r file_name.txt")
-3

I guess you could use os module after writing on your file to change the file permissions like this:

import os
filename=open("file_name","w")
filename.write("my text")
filename.close()
os.system("chmod 444 file_name")
dgsleeps
  • 700
  • 6
  • 7
  • 6
    calling chmod via `os.system` isn't portable, it won't work on windows. Better to use the `os.chmod` method directly. – aruisdante Feb 13 '15 at 05:08