2011-06-03 26 views
18

que tienen este pequeño programa y tiene que crear un pequeño archivo .txt en su carpeta 'Mis Documentos'. Aquí está el código que tengo por que:La constatación del usuario "Mis documentos" Path

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

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

Respuesta

26

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

por ejemplo expanduser('~/filename')

Esto funciona tanto en Unix y Windows, de acuerdo con los documentos.

Editar: barra inclinada debido al comentario de Sven.

+5

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

+1

hey! funcionó. ¡Gracias! –

+1

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

4

En Windows, puede utilizar algo similar lo que se muestra en la respuesta aceptada a la pregunta: Python, get windows special folders for currently logged-in user.

Por el camino My Documents carpeta, utilice shellcon.CSIDL_PERSONAL en la llamada de función en lugar de shell.SHGetFolderPath()shellcon.CSIDL_MYPICTURES.

Así, suponiendo que tiene las extensiones pywin32 instalado, este podría trabajo (véase advertencia en la sección de actualización más adelante):

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

actualización: acabo de leer something que dice que CSIDL_PERSONAL no devolverá la carpeta correcta si el usuario ha cambiado la carpeta de guardar predeterminada en la biblioteca de documentos Win7. Esto se refiere a lo que puede hacer en el diálogo Propiedades de la biblioteca:

screenshot of library properties dialog
La marca de verificación significa que el camino se establece como la ubicación de almacenamiento predeterminada.

Actualmente estoy unware de una forma de llamar a la función SHLoadLibraryFromKnownFolder() través pywin32 (en la actualidad no es una shell.SHLoadLibraryFromKnownFolder. Sin embargo, debería ser posible hacerlo usando el módulo ctypes.

instaladores para el versiones más recientes del pitón para las extensiones de Windows están disponibles actualmente a partir de:     http://sourceforge.net/projects/pywin32

10

Esto funciona sin ningún tipo de 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 los documentos de ubicación y/o ubicación de almacenamiento predeterminada se cambia por el usuario.

+0

Esta respuesta es bastante similar a http://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 valor'! ¿Cual es verdad? De acuerdo con http://stackoverflow.com/a/23852297/1543290, parece que '0' es correcto – Zvika

+0

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

+0

Quiero usar 'current' y not' default value' ¿Cuál es el valor correcto para esto? De acuerdo con el comentario del código de esta respuesta - '1', de acuerdo con la otra respuesta -' 0' – Zvika

Cuestiones relacionadas