Encontrar la ruta “Mis documentos” del usuario

4 minutos de lectura

Tengo este pequeño programa y necesita crear un pequeño archivo .txt en su carpeta ‘Mis documentos’. Aquí está el código que tengo para eso:

textfile=open('C:UsersMYNAMEDocuments','w')
lines=['stuff goes here']
textfile.writelines(lines)
textfile.close()

El problema es que si otras personas lo usan, ¿cómo cambio el MYNAME a su nombre de cuenta?

Encontrar la ruta "Mis documentos" del usuario
José

Usar os.path.expanduser(path), ver http://docs.python.org/library/os.path.html

p.ej expanduser('~/filename')

Esto funciona tanto en Unix como en Windows, según los documentos.

Editar: barra inclinada debido al comentario de Sven.

  • Mejor use una barra inclinada en la ruta: '~/filename'. De lo contrario, obtendrá resultados inesperados para cosas como '~name', donde el n será reemplazado por un carácter de nueva línea.

    – Sven Marnach

    03 jun.

  • @Sven – No estaba seguro. No uso Windows, no estoy seguro de cómo maneja Python los delimitadores de ruta de Windows.

    – José

    03 jun.

  • En Windows un os.path.expanduser('~/filename') la llamada da como resultado algo como 'C:\Documents and Settings\<username>/filename' cual es no la ruta de algo en el usuario My Documents carpeta.

    – martineau

    10 jun.


  • Tenga en cuenta que esto no funciona si el usuario ha movido su carpeta Mis documentos para que ya no se encuentre debajo ~ (por ejemplo, si está en un recurso compartido de red o en una unidad diferente).

    – sapi

    11 jul.

  • esto no funciona lo que necesitas es df = shell.SHGetDesktopFolder() pidl = df.ParseDisplayName(0, None, "::{450d8fba-ad25-11d0-98a8-0800361b1103}")[1] mydocs = shell.SHGetPathFromIDList(pidl)

    – v.oddou

    09 sep.

Encontrar la ruta "Mis documentos" del usuario
axila

Esto funciona sin librerías adicionales:

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)

También funciona si el usuario cambia la ubicación de los documentos y/o la ubicación predeterminada para guardar.

  • Esta respuesta es bastante similar a stackoverflow.com/a/3859336/1543290; sin embargo, definieron SHGFP_TYPE_CURRENT= 0 # Want current, not default value en lugar de esta respuesta SHGFP_TYPE_CURRENT = 1 # Get current, not default value! ¿Cual es verdad? Según stackoverflow.com/a/23852297/1543290, parece que 0 es correcto

    – Zvika

    07 dic. 15 en 20:29

  • @Zvika no está bien o mal. Depende de lo que necesites. Si necesita el valor actual, use 1, si es el valor predeterminado, use 0. Si el usuario cambia la ubicación, obviamente, el valor actual es más esencial.

    – axila

    10 dic. 15 en 10:14

  • Quiero usar current y no default value ¿Qué valor es el adecuado para esto? De acuerdo con el comentario del código de esta respuesta: 1, según la otra respuesta – 0

    – Zvika

    13 dic. 15 en 11:22

  • Usar shell32 = ctypes.OleDLL('shell32'). Utilizando windll (1) no comprueba el HRESULT código y (2) lo deja a merced de cualquier biblioteca que haya configurado para restype, argtypes, y errcheck por windll.shell32.SHGetFolderPathW. Toda la idea de la cdll, windll, y oledll cargadores fue malo desde el principio.

    –Eryk Sun

    13 sep.

  • @EspoirMurhabazi No estoy seguro de lo que quieres decir.

    – axila

    31 ene.

Encontrar la ruta "Mis documentos" del usuario
martineau

En Windows, puede usar algo similar a lo que se muestra en la respuesta aceptada a la pregunta: Python, obtenga carpetas especiales de Windows para el usuario que ha iniciado sesión actualmente.

Para el My Documents ruta de carpeta, usoshellcon.CSIDL_PERSONALen el shell.SHGetFolderPath() llamada de función en lugar de shellcon.CSIDL_MYPICTURES.

Entonces, asumiendo que tienes las extensiones PyWin321 instalado, este podría trabajo (consulte la advertencia en la sección Actualización a continuación):

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

Actualizar: acabo de leer algo que decía eso CSIDL_PERSONAL no devolverá la carpeta correcta si el usuario ha cambiado la carpeta de guardado predeterminada en la biblioteca de documentos de Win7. Esto se refiere a lo que puede hacer en el cuadro de diálogo Propiedades de la biblioteca:

captura de pantalla del cuadro de diálogo de propiedades de la biblioteca

La marca de verificación significa que la ruta se establece como la ubicación de guardado predeterminada.

Actualmente desconozco una forma de llamar al SHLoadLibraryFromKnownFolder() función a través de PyWin32 (actualmente no hay un shell.SHLoadLibraryFromKnownFolder. Sin embargo, debería ser posible hacerlo usando el ctypes módulo.

1Los instaladores de las últimas versiones de Python para extensiones de Windows están disponibles actualmente en: http://sourceforge.net/proyectos/pywin32

Encontrar la ruta "Mis documentos" del usuario
R Legnain

Puede usar las extensiones pywin32 para acceder a la API de Win32. Con el uso de la API de Win32, puede obtener la carpeta virtual que representa el elemento de escritorio Mis documentos.

from win32com.shell import shell, shellcon
doc_folder = shell.SHGetFolderPath(0, shellcon.CSIDL_PERSONAL, None, 0)

Aquí puede encontrar la descripción de CSIDL_PERSONAL:
https://docs.microsoft.com/en-us/windows/win32/shell/csidl

  • ¿En qué se diferencia esto de la respuesta aceptada?

    – Encantador de serpientes

    05 abr.

  • Esto podría estar bien en Linux y macOS, pero en muchos casos da un resultado incorrecto en Windows.

    – stblasitude

    09 abr.

.

¿Ha sido útil esta solución?