Abrir archivo conociendo solo una parte de su nombre

Actualmente estoy leyendo un archivo e importando los datos en él con la línea:

# Read data from file. data = np.loadtxt(join(mypath, 'file.data'), unpack=True) 

donde se conoce la variable mypath . El problema es que el archivo file.data cambiará con el tiempo asumiendo nombres como:

 file_3453453.data file_12324.data file_987667.data ... 

Así que necesito una forma de decirle al código que abra el archivo en esa ruta que tiene un nombre como file*.data , asumiendo que siempre habrá un solo archivo con ese nombre en la ruta. ¿Hay una manera de hacer esto en python ?

Puede utilizar el módulo glob . Permite la coincidencia de patrones en los nombres de archivo y hace exactamente lo que estás preguntando

 import glob for fpath in glob.glob(mypath): print fpath 

Por ejemplo, tengo un directorio con archivos llamados google.xml, google.json y google.csv.

Puedo usar glob de esta manera:

 >>> import glob >>> glob.glob('g*gle*') ['google.json', 'google.xml', 'google.csv'] 

Tenga en cuenta que glob utiliza el módulo fnmatch , pero tiene una interfaz más simple y coincide con las rutas en lugar de los nombres de archivos solamente.

Puede buscar rutas relativas y no tiene que usar os.path.join . En el ejemplo anterior, si cambio al directorio principal e bash hacer coincidir los nombres de los archivos, devuelve las rutas relativas:

 >>> import os >>> import glob >>> os.chdir('..') >>> glob.glob('foo/google*') ['foo/google.json', 'foo/google.xml', 'foo/google.csv'] 

También fnmatch ver fnmatch :

 >>> import fnmatch >>> import os >>> >>> fnmatch.filter(os.listdir('.'), 'file_*.data') ['file_3453453.data'] >>> 

Una solución simple sería utilizar los módulos de Python “os” y “re”:

 import os import re for file in os.listdir(mypath): if re.match("file_\d+\.data", file): ... 

Tratar

 import os [os.path.join(root, f) for root, _, files in os.walk(mypath) for f in files if f.startswith('file') and f.endswith('.data')] 

Devolverá una lista de todos los archivos file*.data , en caso de que haya más de uno. Usted puede simplemente iterar a través de ellos. Si solo hay un archivo, simplemente coloque [0] al final de la lista de comprensión.