2010-01-21 21 views
13

Aunque Windows no distingue entre mayúsculas y minúsculas, conserva la mayúscula en los nombres de archivo. En Python, ¿hay alguna forma de obtener un nombre de archivo con mayúsculas y minúsculas ya que está almacenado en el sistema de archivos?Python: ¿cómo obtener el nombre del archivo en Windows?

P. ej., En un programa de Python tengo el nombre de archivo = "texas.txt", pero quiero saber que en realidad está almacenado "TEXAS.txt" en el sistema de archivos, incluso si esto no tiene importancia para varias operaciones de archivos.

+0

(cuentas duplicadas accidental fusionaron) –

Respuesta

8

Ésta es la forma más sencilla de hacerlo:

>>> import win32api 
>>> win32api.GetLongPathName(win32api.GetShortPathName('texas.txt'))) 
'TEXAS.txt' 
+0

Esto no funcionó para mí, aún obtengo 'texas.txt'. – diggums

+1

¿Funciona 'win32api.GetLongPathName (win32api.GetShortPathName ('texas.txt'))'? –

+2

Sí, eso funciona. En realidad, para aclarar, su sugerencia original funciona, pero no si incluye un directorio, por ejemplo, 'win32api.GetLongPathName ('\\ states \\ texas.txt')' produce ''\\ states \\ TEXAS.txt'' , mientras que 'win32api.GetLongPathName (win32api.GetShortPathName ('\\ states \\ texas.txt'))' cede correctamente ''\\ STATES \\ TEXAS.txt''.Eso me había confundido, ahora estoy listo. ¡Gracias! – diggums

1
>>> import os 
>>> os.listdir("./") 
['FiLeNaMe.txt'] 

¿Responde a esta pregunta?

1

que puede usar:

import os 
a = os.listdir('mydirpath') 
b = [f.lower() for f in a] 
try: 
    i = b.index('texas.txt') 
    print a[i] 
except ValueError: 
    print('File not found in this directory') 

Por supuesto, esto supone que la cadena de búsqueda 'texas.txt' está en minúsculas. Si no es así, primero deberá convertirlo a minúsculas.

+2

'print ([f para f en os.listdir (" mydirpath ") si f.lower() ==" texas.txt "] + [" archivo no encontrado "]) [0]' –

+0

@Roger: Haha , ¡Buena cosa! Todavía estoy entendiendo el poder de las listas de comprensión. Sin embargo, no suelo publicar respuestas de una sola línea, ya que a menudo pueden ser más confusas que esclarecedoras :). –

+0

Solo una nota: ya no es necesario usar string.lower(). – ghostdog74

1

y si quieres recursiva directorios

import os 
path=os.path.join("c:\\","path") 
for r,d,f in os.walk(path): 
    for file in f: 
     if file.lower() == "texas.txt": 
       print "Found: ",os.path.join(r , file) 
5

tuve problemas con los caracteres especiales con la solución win32api anteriormente. Para nombres de archivo Unicode es necesario utilizar:

win32api.GetLongPathNameW(win32api.GetShortPathName(path)) 
+2

Buen punto (se aplica a Python 2.x - no es necesario en 3.x, que es nativamente Unicode). Solo para ser explícito: la ruta de entrada (también) debe ser una cadena Unicode (por ejemplo, 'u'texas.txt''). – mklement0

+0

Ver mi comentario a http://stackoverflow.com/a/2114975/179715; esto no está garantizado para funcionar si la generación corta de nombre de archivo está deshabilitada. – jamesdlin

0

Ésta es solamente lib estándar y convierte todas las partes de trayectoria (excepto letra de la unidad):

def casedpath(path): 
    r = glob.glob(re.sub(r'([^:/\\])(?=[/\\]|$)', r'[\1]', path)) 
    return r and r[0] or path 

Y esto se maneja rutas UNC, además:

def casedpath_unc(path): 
    unc, p = os.path.splitunc(path) 
    r = glob.glob(unc + re.sub(r'([^:/\\])(?=[/\\]|$)', r'[\1]', p)) 
    return r and r[0] or path 

Nota: es algo más lento que el sistema archivo dependiente Win API "GetShortPathName" truco, pero funciona plataforma & sistema de archivos independiente y también cuando la generación de nombre de archivo corto se apaga en los volúmenes de Windows (fsutil.exe 8dot3name query C:) - que es recommended al menos para los sistemas de archivos críticos de rendimiento cuando no hay aplicaciones de 16 bits se basan más en la que:

fsutil.exe behavior set disable8dot3 1 
Cuestiones relacionadas