How can I get the (XDG) Default User Directories from Python?

By example, In English the default user folders will be:

$HOME/Desktop
....
$HOME/Videos

In Spanish the default user folders will be:

$HOME/Escritorio
....
$HOME/Vídeos

The file ~/.config/user-dirs.dirs has those localize names for the default folders. (Always?).

I need to get those names from a python script. I'd like not to parse that file. Is there other elegant way? I found this:

from xdg.BaseDirectory import *
print xdg_cache_home
print xdg_config_dirs
print xdg_config_home
print xdg_data_dirs
print xdg_data_home

But it doesn't return those folders.

Thanks in advance!


Install the python library to access freedesktop.org standards

To get the XDG directories from Python you need to install (depending on your python version) one of the following packages:

For Python 2.x

sudo apt-get install python-xdg

For Python 3:

sudo apt-get install python3-xdg 

XDG Directories

  • $XDG_DATA_HOME defines the base directory relative to which user specific data files should be stored. If $XDG_DATA_HOME is either not set or empty, a default equal to $HOME/.local/share should be used.

  • $XDG_CONFIG_HOME defines the base directory relative to which user specific configuration files should be stored. If $XDG_CONFIG_HOME is either not set or empty, a default equal to $HOME/.config should be used.

  • $XDG_DATA_DIRS defines the preference-ordered set of base directories to search for data files in addition to the $XDG_DATA_HOME base directory. The directories in $XDG_DATA_DIRS should be separated with a colon ':'.

    If $XDG_DATA_DIRS is either not set or empty, a value equal to /usr/local/share/:/usr/share/ should be used.

  • $XDG_CONFIG_DIRS defines the preference-ordered set of base directories to search for configuration files in addition to the $XDG_CONFIG_HOME base directory. The directories in $XDG_CONFIG_DIRS should be seperated with a colon ':'.

    If $XDG_CONFIG_DIRS is either not set or empty, a value equal to /etc/xdg should be used.

Source: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html

UPDATE: How to access Ubuntu specific XDG user directories:

The ~/.config/user-dirs.dirs file will always contain the localize names as the xdg-user-dirs-update tool controls this file, see the dedicated man page section:

   The XDG user dirs configuration is stored in the user-dirs.dir
   file in the location pointed to by the XDG_CONFIG_HOME
   environment variable.

The following python code will allow you to parse the ~/.config/user-dirs.dirs.

#!/usr/bin/env python

import io
import os
import re
import ConfigParser

from xdg.BaseDirectory import xdg_config_home

config = ConfigParser.RawConfigParser(allow_no_value=True)

f = open(os.path.join(xdg_config_home, "user-dirs.dirs"))
user_config = "[XDG_USER_DIR]\n" + f.read()
f.close()
user_config = re.sub('\$HOME', os.path.expanduser("~"), user_config)
user_config = re.sub('"', '', user_config)

config.readfp(io.BytesIO(user_config))
print config.get("XDG_USER_DIR", "XDG_PICTURES_DIR")

If you don't mind getting a dependency on GLib or if you're already using GTK as toolkit, you can use the GLib.get_user_special_dir() method.

>>> from gi.repository import GLib
>>> GLib.get_user_special_dir(GLib.USER_DIRECTORY_PICTURES)
'/home/timo/Afbeeldingen'
>>> GLib.get_user_special_dir(GLib.USER_DIRECTORY_DOCUMENTS)
'/home/timo/Documenten'
>>> GLib.get_user_special_dir(GLib.USER_DIRECTORY_DOWNLOAD)
'/home/timo/Downloads'

All available directories:

G_USER_DIRECTORY_DESKTOP         the user's Desktop directory
G_USER_DIRECTORY_DOCUMENTS       the user's Documents directory
G_USER_DIRECTORY_DOWNLOAD        the user's Downloads directory
G_USER_DIRECTORY_MUSIC           the user's Music directory
G_USER_DIRECTORY_PICTURES        the user's Pictures directory
G_USER_DIRECTORY_PUBLIC_SHARE    the user's shared directory
G_USER_DIRECTORY_TEMPLATES       the user's Templates directory
G_USER_DIRECTORY_VIDEOS          the user's Movies directory
G_USER_N_DIRECTORIES             the number of enum values

If you get this error message:

ImportError: When using gi.repository you must not import static modules like "gobject". Please change all occurrences of "import gobject" to "from gi.repository import GObject".

You need to use this:

import glib
return glib.get_user_special_dir(glib.USER_DIRECTORY_PICTURES)