| You are here: Inicio > Inmersión en Python > Excepciones y gestión de ficheros > Trabajo con directorios | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
El módulo os.path tiene varias funciones para manipular ficheros y directorios. Aquí queremos manipular rutas y listar el contenido de un directorio.
>>> import os >>> os.path.join("c:\\music\\ap\\", "mahadeva.mp3")![]()
'c:\\music\\ap\\mahadeva.mp3' >>> os.path.join("c:\\music\\ap", "mahadeva.mp3")
'c:\\music\\ap\\mahadeva.mp3' >>> os.path.expanduser("~")
'c:\\Documents and Settings\\mpilgrim\\My Documents' >>> os.path.join(os.path.expanduser("~"), "Python")
'c:\\Documents and Settings\\mpilgrim\\My Documents\\Python'
| os.path es una referencia a un módulo (qué módulo exactamente, depende de su plataforma). Al igual que getpass encapsula las diferencias entre plataformas asociando getpass a una función específica, os encapsula las diferencias entre plataformas asociando path a un módulo específico para la suya. | |
| La función join de os.path construye el nombre de una ruta partiendo de una o más rutas parciales. En este caso, simplemente concatena cadenas (observe que trabajar con nombres de rutas en Windows es molesto debido a que hay que escapar la barra inversa). | |
| En este caso ligeramente menos trivial, join añadirá una barra inversa extra a la ruta antes de unirla al nombre de fichero. Quedé encantadísimo cuando descubrí esto, ya que addSlashIfNecessary es una de las pequeñas funciones estúpidas que siempre tengo que escribir cuando escribo mis propias herramientas en un nuevo lenguaje. No escriba esta pequeña estúpida función en Python: hay gente inteligente que ya lo ha hecho por usted. | |
| expanduser expandirá un nombre de ruta que utilice ~ para representar el directorio personal del usuario actual. Esto funciona en cualquier plataforma donde los usuarios tengan directorios personales, como Windows, UNIX y Mac OS X; no tiene efecto en Mac OS. | |
| Combinando estas técnicas, puede construir fácilmente rutas para directorios y ficheros bajo el directorio personal del usuario. |
>>> os.path.split("c:\\music\\ap\\mahadeva.mp3")('c:\\music\\ap', 'mahadeva.mp3') >>> (filepath, filename) = os.path.split("c:\\music\\ap\\mahadeva.mp3")
>>> filepath
'c:\\music\\ap' >>> filename
'mahadeva.mp3' >>> (shortname, extension) = os.path.splitext(filename)
>>> shortname 'mahadeva' >>> extension '.mp3'
| La función split divide una ruta completa y devuelve una tupla que contiene la ruta y el nombre del fichero. ¿Recuerda cuando dije que podría usar la asignación de múltiples variables para recoger varios valores de una función? Bien, split es una de esas funciones. | |
| Asignamos el valor de retorno de la función split a una tupla con dos variables. Cada variable recibe el valor del elemento correspondiente de la tupla devuelta. | |
| La primera variable, filepath, recibe el valor del primer elemento de la tupla devuelta por split, la ruta hasta el fichero. | |
| La segunda variable, filename, recibe el valor del segundo elemento de la tupla devuelta por split, el nombre del fichero. | |
| os.path también contiene una función splitext, que divide un nombre de fichero y devuelve una tupla que contiene el nombre y la extensión. Usamos la misma técnica para asignar cada una de ellas a variables distintas. |
>>> os.listdir("c:\\music\\_singles\\")['a_time_long_forgotten_con.mp3', 'hellraiser.mp3', 'kairo.mp3', 'long_way_home1.mp3', 'sidewinder.mp3', 'spinning.mp3'] >>> dirname = "c:\\" >>> os.listdir(dirname)
['AUTOEXEC.BAT', 'boot.ini', 'CONFIG.SYS', 'cygwin', 'docbook', 'Documents and Settings', 'Incoming', 'Inetpub', 'IO.SYS', 'MSDOS.SYS', 'Music', 'NTDETECT.COM', 'ntldr', 'pagefile.sys', 'Program Files', 'Python20', 'RECYCLER', 'System Volume Information', 'TEMP', 'WINNT'] >>> [f for f in os.listdir(dirname) ... if os.path.isfile(os.path.join(dirname, f))]
['AUTOEXEC.BAT', 'boot.ini', 'CONFIG.SYS', 'IO.SYS', 'MSDOS.SYS', 'NTDETECT.COM', 'ntldr', 'pagefile.sys'] >>> [f for f in os.listdir(dirname) ... if os.path.isdir(os.path.join(dirname, f))]
['cygwin', 'docbook', 'Documents and Settings', 'Incoming', 'Inetpub', 'Music', 'Program Files', 'Python20', 'RECYCLER', 'System Volume Information', 'TEMP', 'WINNT']
| La función listdir toma una ruta y devuelve una lista con el contenido de ese directorio. | |
| listdir devuelve tanto ficheros como carpetas, sin indicar qué cosa es cada uno. | |
| Puede usar el filtrado de listas y la función isfile del módulo os.path para separar los ficheros de los directorios. isfile toma una ruta y devuelve 1 si representa un fichero, y un 0 si no. Aquí estamos usando os.path.join para asegurarnos de tener una ruta completa, pero isfile también funciona con rutas parciales, relativas al directorio actual de trabajo. Puede usar os.getcwd() para obtener el directorio de trabajo. | |
| os.path también tiene una función isdir que devuelve 1 si la ruta representa un directorio y 0 si no. Puede usarlo para obtener una lista de los subdirectorios dentro de un directorio. |
def listDirectory(directory, fileExtList): """obtener lista de objetos de información sobre ficheros de extensiones particulares""" fileList = [os.path.normcase(f) for f in os.listdir(directory)]![]()
fileList = [os.path.join(directory, f) for f in fileList if os.path.splitext(f)[1] in fileExtList]
![]()
![]()
| Siempre que sea posible, debería usar las funciones de os y os.path para manipulaciones sobre ficheros, directorios y rutas. Estos módulos encapsulan lo específico de cada plataforma, de manera que funciones como os.path.split funcionen en UNIX, Windows, Mac OS y cualquier otra plataforma en que funcione Python. | |
Hay otra manera de obtener el contenido de un directorio. Es muy potente, y utiliza los comodines con los que posiblemente esté familiarizado al trabajar en la línea de órdenes.
>>> os.listdir("c:\\music\\_singles\\")['a_time_long_forgotten_con.mp3', 'hellraiser.mp3', 'kairo.mp3', 'long_way_home1.mp3', 'sidewinder.mp3', 'spinning.mp3'] >>> import glob >>> glob.glob('c:\\music\\_singles\\*.mp3')
['c:\\music\\_singles\\a_time_long_forgotten_con.mp3', 'c:\\music\\_singles\\hellraiser.mp3', 'c:\\music\\_singles\\kairo.mp3', 'c:\\music\\_singles\\long_way_home1.mp3', 'c:\\music\\_singles\\sidewinder.mp3', 'c:\\music\\_singles\\spinning.mp3'] >>> glob.glob('c:\\music\\_singles\\s*.mp3')
['c:\\music\\_singles\\sidewinder.mp3', 'c:\\music\\_singles\\spinning.mp3'] >>> glob.glob('c:\\music\\*\\*.mp3')
![]()
<< Uso de sys.modules |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
Todo junto >> |