How to change file system encoding via python?

The file system encoding is, in many cases, an inherent property of the operating system. It cannot be changed — if, for some reason, you need to create files with names encoded differently than the filesystem encoding implies, don't use Unicode strings for filenames. (Or, if you're using Python 3, use a bytes object instead of a string.)

See the documentation for details. In particular, note that, on Windows systems, the file system is natively Unicode, so no conversion is actually taking place, and, consequently, it's impossible to use an alternative filesystem encoding.


There are two ways to change it:

  1. (linux-only) export LC_CTYPE=en_US.UTF-8 before launching python:
$ LC_CTYPE=C python -c 'import sys; print(sys.getfilesystemencoding())'
ANSI_X3.4-1968
$ LC_CTYPE=en_US.UTF-8 python -c 'import sys; print(sys.getfilesystemencoding())'
UTF-8

Note that LANG serves as the default value for LC_CTYPE if it is not set, while LC_ALL overrides both LC_CTYPE and LANG)

  1. monkeypatching:
import sys
sys.getfilesystemencoding = lambda: 'UTF-8'

Both methods let functions like os.stat accept unicode (python2.x) strings. Otherwise those functions raise an exception when they see non-ascii symbols in the filename.

Update: In the (1) variant the locale has to be available (present in locale -a) for this setting to have the desired effect.