Поиск пути пользователя "Мои документы"

У меня есть эта небольшая программа, и ей нужно создать небольшой .txt файл в папке "Мои документы". Вот код, который у меня есть для этого:

textfile=open('C:\Users\MYNAME\Documents','w')
lines=['stuff goes here']
textfile.writelines(lines)
textfile.close()

Проблема в том, что если другие люди используют его, как мне изменить MYNAME на имя своей учетной записи?

Ответ 1

Используйте os.path.expanduser(path), см. http://docs.python.org/library/os.path.html

например. expanduser('~/filename')

Это работает как в Unix, так и в Windows, согласно документам.

Изменить: косую черту из-за комментария Sven.

Ответ 2

Это работает без дополнительных libs:

import ctypes.wintypes
CSIDL_PERSONAL = 5       # My Documents
SHGFP_TYPE_CURRENT = 0   # Get current, not default value

buf= ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH)
ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf)

print(buf.value)

Также работает, если пользователь поменяет местоположение и/или местоположение сохранения по умолчанию.

Ответ 3

В Windows вы можете использовать что-то похожее, что показано в принятом ответе на вопрос: Python, получить специальные папки Windows для текущего зарегистрированного пользователя.

Для пути папки My Documents используйте shellcon.CSIDL_PERSONAL в вызове функции shell.SHGetFolderPath() вместо shellcon.CSIDL_MYPICTURES.

Итак, если у вас установлены расширения PyWin32 1 это может сработать (см. оговорку в разделе "Обновление" ниже):

>>> from win32com.shell import shell, shellcon
>>> shell.SHGetFolderPath(0, shellcon.CSIDL_PERSONAL, None, 0)
u'<path\\to\\folder>'

Обновление: я просто прочитал что-то, в котором говорится, что CSIDL_PERSONAL не вернет правильную папку, если пользователь изменил значение по умолчанию сохранить папку в библиотеке документов Win7. Это относится к тому, что вы можете сделать в диалоговом окне свойств библиотеки:

screenshot of library properties dialog
Флажок означает, что путь задан как место сохранения по умолчанию.

В настоящее время я не знаю, как вызвать функцию SHLoadLibraryFromKnownFolder() через PyWin32 (там в настоящее время нет shell.SHLoadLibraryFromKnownFolder. Однако это должно быть возможно с помощью модуля ctypes.

1 Установщики для последних версий Python для Windows Extensions в настоящее время доступны из:   http://sourceforge.net/projects/pywin32