Categorías
Python

Despliegue de Django en Dokku

 

Tabla de Contenidos

  • El problema con Python Path gestión de ficheros
  • Creación Caminos
  • de lectura y escritura de archivos
  • que selecciona Componentes del trazado
  • traslado y eliminación de archivos
  • ExamplesCounting FilesDisplay un Directorio TreeFind la última actualización FileCreate una único nombre de archivo
  • Contar archivos
  • Mostrar un árbol de directorios
  • encontrar al último archivo modificado
  • crear un archivo único diferencias Nombre
  • sistema operativo
  • Caminos como propio Objetos
  • Conclusión
  • Contar archivos
  • Display un árbol de directorios
  • encontrar al último archivo modificado
  • crear un archivo único Nombre

Tiene luchado con el manejo en Python ruta del archivo? En Python 3.4 y superiores, la lucha ha terminado! Ya no hay necesidad de rascarse la cabeza sobre un código como:

>>> path.rsplit('\\', maxsplit=1)[0]

O estremecen con el nivel de detalle:

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))

En este tutorial, verá cómo trabajar con archivos trayectos de nombres de directorios y archivos en Python. Usted aprenderá nuevas formas de leer y escribir archivos, manipular caminos y el sistema de archivos subyacente, así como ver algunos ejemplos de cómo a la lista de archivos y iterar sobre ellos. Con el módulo de pathlib, los dos ejemplos anteriores pueden reescribirse usando elegante, fácil de leer, y Pythonic código como:

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()

Free PDF Descargar: Python 3 Hoja de trucos

El problema con Python Ruta del archivo de manipulación

Trabajo con archivos y interactuando con el sistema de archivos son importantes por muchas razones diferentes. Los casos más simples pueden implicar sólo lectura o escritura de archivos, pero a veces las tareas más complejas están a la mano. Tal vez usted necesita para listar todos los archivos en un directorio de un tipo dado, encontrar el directorio principal de un archivo determinado, o crear un nombre de archivo único que aún no existe.

Tradicionalmente, Python ha representado rutas de archivos que utilizan cadenas de texto normales. Con el apoyo de la biblioteca estándar os.path, esto ha sido adecuada, aunque un engorroso bits (como el segundo ejemplo, en los espectáculos de introducción). Sin embargo, ya que los caminos no son cadenas, importante funcionalidad se extiende por toda la biblioteca estándar, incluyendo bibliotecas como sistema operativo, glob, y shutil. El siguiente ejemplo se necesita tres sentencias de importación sólo para mover todos los archivos de texto a un directorio de archivo:

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
new_path = os.path.join('archive', file_name)
shutil.move(file_name, new_path)

Con caminos representado por cuerdas, es posible, pero por lo general una mala idea, utilizar métodos de cadena regulares. Por ejemplo, en lugar de unir dos caminos con + como cuerdas regulares, se debe utilizar os.path.join (), que se une a caminos utilizando el separador de ruta correcta en el sistema operativo. Recordemos que Windows utiliza \ mientras Mac y Linux uso / como separador. Esta diferencia puede dar lugar a errores difíciles de detectar, tales como nuestro primer ejemplo en el trabajo de introducción de sólo rutas de Windows.

El módulo pathlib se introdujo en Python 3.4 (PEP 428) para hacer frente a estos desafíos. Reúne la funcionalidad necesaria en un lugar y lo pone a disposición a través de métodos y propiedades de un objeto Path-fácil de usar.

Desde el principio, otros paquetes todavía se utiliza cuerdas para rutas de archivos, pero a partir de Python 3.6, el módulo pathlib se apoya en toda la biblioteca estándar, en parte debido a la adición de un protocolo de ruta del sistema de archivos. Si usted está atascado en el legado de Python, también hay un backport disponibles para Python 2.

Tiempo de acción: vamos a ver cómo funciona en la práctica pathlib.

Creación Caminos

Todo lo que necesita saber acerca de la clase es pathlib.Path. Hay algunas maneras diferentes de crear un camino. En primer lugar, hay classmethods como .cwd () (directorio actual de trabajo) y .home (directorio principal del usuario) ():

>>> import pathlib
>>> pathlib.Path.cwd()
PosixPath('/home/gahjelle/realpython/')

Nota: largo de este tutorial, vamos a suponer que pathlib se ha importado, sin deletreando pathlib importación que el anterior. A medida que principalmente va a utilizar la clase Path, también se puede hacer a partir de ruta de importación y pathlib camino de escritura en lugar de pathlib.Path.

Una ruta también se pueden crear explícitamente de su representación de cadena:

>>> pathlib.Path(r'C:\Users\gahjelle\realpython\file.txt')
WindowsPath('C:/Users/gahjelle/realpython/file.txt')

Un pequeño consejo para tratar con rutas de Windows: En Windows, el separador de ruta es una barra invertida, \. Sin embargo, en muchos contextos, la barra invertida también se utiliza como un carácter de escape con el fin de representar los caracteres no imprimibles. Para problemas de evitar, el uso literales de cadena prima para representar vías de Windows. Estos son los literales de cadena que tienen un r antepuesto a ellos. En literales de cadena prima la \ representa una barra invertida literal: R’C: \ Users’.

Una tercera manera de construir una ruta de acceso es para unir las partes de la ruta de acceso utilizando el operador / especial. El operador barra inclinada se utiliza independientemente del separador de ruta real sobre la plataforma:

>>> pathlib.Path.home() / 'python' / 'scripts' / 'test.py'
PosixPath('/home/gahjelle/python/scriptsest.py')

El / puede ensamblar varios caminos o una mezcla de caminos y cadenas (como antes), siempre que haya al menos un objeto Path. Si no te gusta el especial / notación, se puede hacer lo mismo con el método .joinpath ():

>>> pathlib.Path.home().joinpath('python', 'scripts', 'test.py')
PosixPath('/home/gahjelle/python/scriptsest.py')

Tenga en cuenta que en los ejemplos anteriores, el pathlib.Path está representado por una cualquiera o una WindowsPath PosixPath. El objeto real que representa la ruta depende del sistema operativo subyacente. (Es decir, el ejemplo WindowsPath se ha ejecutado en Windows, mientras que los ejemplos PosixPath han llevado a cabo en Mac o Linux.) Vea la sección Diferencias sistema operativo para obtener más información.

de lectura y escritura de archivos

Tradicionalmente, la forma de leer o escribir un archivo en Python ha sido utilizar el incorporado en la función open (). Esto sigue siendo cierto que la función open () puede utilizar la ruta objetos directamente. El siguiente ejemplo busca todos los encabezados en un archivo de rebajas y los imprime:

path = pathlib.Path.cwd() / 'test.md'
with open(path, mode='r') as fid:
headers = [line.strip() for line in fid if line.startswith('#')]
print('\n'.join(headers))

Una alternativa equivalente es llamar .open () en el objeto Path:

with path.open(mode='r') as fid:
...

De hecho, Path.open () llama a la incorporada en el abierto () detrás de las escenas. La opción que se utiliza es principalmente una cuestión de gusto.

Por simple lectura y escritura de archivos, hay un par de métodos de conveniencia en la biblioteca pathlib:

  • .read_text (): abrir el camino en modo texto y devolver el contenido como una cadena. .read_bytes
  • (): abrir el camino en binario modo / bytes y devolver el contenido como una cadena de bytes.
  • .write_text (): abrir los datos de la trayectoria y de cadena escribir en él. .write_bytes
  • (): abrir el camino en binario / bytes de modo y escribir datos en ella.

Cada uno de estos métodos se encarga de abrir y cerrar el archivo, por lo que un uso trivial, por ejemplo:

>>> path = pathlib.Path.cwd() / 'test.md'
>>> path.read_text()

Caminos también puede especificarse como nombres de archivos simples, en cuyo caso se interpretan en relación con el directorio de trabajo actual . El siguiente ejemplo es equivalente al anterior: Método

>>> pathlib.Path('test.md').read_text()

la .resolve () encontrará la ruta completa. A continuación, se confirma que el directorio de trabajo actual se utiliza para nombres de archivo simples:

>>> path = pathlib.Path('test.md')
>>> path.resolve()
PosixPath('/home/gahjelle/realpythonest.md')
>>> path.resolve().parent == pathlib.Path.cwd()
False

Tenga en cuenta que cuando se comparan los caminos, son sus representaciones que se comparan. En el ejemplo anterior, path.parent no es igual a pathlib.Path.cwd (), porque path.parent está representado por ». mientras pathlib.Path.cwd () está representado por ‘/ home / gahjelle / realpython /’.

que selecciona los componentes de una ruta de

Las diferentes partes de un camino están convenientemente disponibles como propiedades. Ejemplos básicos incluyen:

  • .name: el nombre del archivo sin ningún directorio
  • .parent: el directorio que contiene el archivo o el directorio padre si la ruta es un directorio
  • .stem: el nombre del archivo sin el sufijo
  • . sufijo: la extensión de archivo
  • .anchor: la parte del camino antes de que los directorios

Aquí son estas propiedades en acción:

>>> path
PosixPath('/home/gahjelle/realpythonest.md')
>>> path.name
'test.md'
>>> path.stem
'test'
>>> path.suffix
'.md'
>>> path.parent
PosixPath('/home/gahjelle/realpython')
>>> path.parent.parent
PosixPath('/home/gahjelle')
>>> path.anchor
'/'

Tenga en cuenta que los rendimientos .parent un nuevo objeto de trazado, mientras que las otras propiedades devuelven cadenas. Esto significa, por ejemplo, que .parent pueden encadenarse como en el último ejemplo, o incluso combinar con / para crear completamente nuevos caminos:

>>> path.parent.parent / ('new' + path.suffix)
PosixPath('/home/gahjelle
ew.md')

La excelente Pathlib Cheatsheet proporciona una representación visual de estas y otras propiedades y métodos.

traslado y eliminación de archivos

A través pathlib, también tiene acceso a las operaciones básicas de nivel de sistema de archivos como mover, actualización, e incluso la eliminación de archivos. En su mayor parte, estos métodos no dan una advertencia o esperar una confirmación antes de información o archivos se pierden. Tenga cuidado al usar estos métodos.

Para mover un archivo, el uso .replace (). Tenga en cuenta que si el destino ya existe, .replace () será sobrescrita. Por desgracia, pathlib no admite explícitamente en movimiento seguro de los archivos. Para evitar la posibilidad de sobrescribir la ruta de destino, el más simple es poner a prueba si existe el destino antes de reemplazar:

if not destination.exists():
source.replace(destination)

Sin embargo, esto deja la puerta abierta a una posible condición de carrera. Otro proceso puede añadir un archivo en la ruta de destino entre la ejecución de la sentencia if y el método .replace (). Si esto es una preocupación, es una forma más segura para abrir la ruta de destino para la creación exclusiva y copiar explícitamente los datos de origen:

with destination.open(mode='xb') as fid:
fid.write(source.read_bytes())

El código anterior elevará un FileExistsError si el destino ya existe. Técnicamente, esta copia un archivo. Para llevar a cabo un movimiento, simplemente fuente de borrado después de que se realiza la copia (véase más adelante). Asegúrese de que no es una excepción fue levantado sin embargo.

Cuando se está cambiando el nombre de archivos, métodos útiles podría ser .with_name () y .with_suffix (). Ambos devuelven la ruta original, pero con el nombre o el sufijo reemplazados, respectivamente.

Por ejemplo:

>>> path
PosixPath('/home/gahjelle/realpythonest001.txt')
>>> path.with_suffix('.py')
PosixPath('/home/gahjelle/realpythonest001.py')
>>> path.replace(path.with_suffix('.py'))

directorios y archivos se pueden eliminar usando .rmdir () y .unlink () respectivamente. (Una vez más, tenga cuidado!) Ejemplos

En esta sección, podrás ver algunos ejemplos de cómo utilizar pathlib para hacer frente a los retos simples.

Contar archivos

Hay algunas maneras diferentes para mostrar muchos archivos. El más simple es el método .iterdir (), que itera sobre todos los archivos en el directorio dado. Los siguientes ejemplos se combina .iterdir () con la clase collections.Counter para contar la cantidad de archivos que hay de cada tipo de archivo en el directorio actual:

>>> import collections
>>> collections.Counter(p.suffix for p in pathlib.Path.cwd().iterdir())
Counter({'.md': 2, '.txt': 4, '.pdf': 2, '.py': 1})

listados de archivos más flexibles pueden ser creados con los métodos .glob () y .rglob ( ) (recursiva glob). Por ejemplo, pathlib.Path.cwd (). Glob ( ‘*. Txt’) devuelve todos los archivos con un sufijo .txt en el directorio actual. Los siguientes tipos de archivos solamente las cuentas que comienzan con p:

>>> import collections
>>> collections.Counter(p.suffix for p in pathlib.Path.cwd().glob('*.p*'))
Counter({'.pdf': 2, '.py': 1})

mostrar un directorio árbol

El siguiente ejemplo define una función, árbol (), que va a imprimir un árbol visual que representa la jerarquía de archivos que cuelga de un directorio dado. Aquí, queremos subdirectorios lista, así que utilizamos el método .rglob ():

def tree(directory):
print(f'+ {directory}')
for path in sorted(directory.rglob('*')):
depth = len(path.relative_to(directory).parts)
spacer = ' ' * depth
print(f'{spacer}+ {path.name}')

Tenga en cuenta que tenemos que saber a qué distancia desde el directorio raíz de un archivo se encuentra. Para ello, el primero en utilizar .relative_to () para representar una ruta relativa al directorio raíz. A continuación, se cuenta el número de directorios (mediante la propiedad .parts) en la representación. Cuando es ejecutado, esta función crea un árbol visual como la siguiente:

>>> tree(pathlib.Path.cwd())
+ /home/gahjelle/realpython
+ directory_1
+ file_a.md
+ directory_2
+ file_a.md
+ file_b.pdf
+ file_c.py
+ file_1.txt
+ file_2.txt

Nota: el F-cuerdas único trabajo en Python 3.6 y posteriores. En pitones mayores, la expresión f ‘{spacer} + {path.name}’ puede escribirse ‘{0} + {1}’. Formato (espaciador, path.name).

encontrar al último archivo modificado

El .iterdir (), .glob (), y .rglob () métodos son grandes ajustes para las expresiones generadoras y las listas por comprensión. Para encontrar el archivo en un directorio que fue modificada por última vez, se puede utilizar el método .stat () para obtener información sobre los archivos subyacentes. . Por ejemplo, .stat () st_mtime da la hora de la última modificación de un archivo:

>>> from datetime import datetime
>>> time, file_path = max((f.stat().st_mtime, f) for f in directory.iterdir())
>>> print(datetime.fromtimestamp(time), file_path)
2018-03-23 19:23:56.977817 /home/gahjelle/realpythonest001.txt

Incluso se puede obtener el contenido del archivo que fue modificada con una expresión similar última:

>>> max((f.stat().st_mtime, f) for f in directory.iterdir())[1].read_text()

La marca de tiempo de regresar de lo diferente. stat (). propiedades ST_ representa segundos desde el 1 de enero de 1970. Además de datetime.fromtimestamp, time.localtime o time.ctime puede ser usado para convertir la marca de tiempo a algo más utilizable.

crear un archivo único Nombre

El último ejemplo mostrará cómo construir un nombre de archivo numerado única basada en una plantilla. En primer lugar, especifica un patrón para el nombre del archivo, con espacio para un contador. A continuación, compruebe la existencia de la ruta del archivo creado por unirse a un directorio y el nombre del archivo (con un valor para el contador). Si ya existe, aumentar el contador y vuelve a intentarlo:

def unique_path(directory, name_pattern):
counter = 0
while True:
counter += 1
path = directory / name_pattern.format(counter)
if not path.exists():
return path

path = unique_path(pathlib.Path.cwd(), 'test{:03d}.txt')

Si el directorio ya contiene los archivos test001.txt y test002.txt, el código anterior será establecer la ruta a test003.txt. Las diferencias del sistema operativo

Anteriormente, hemos observado que cuando se crea una instancia pathlib.Path, fue devuelto, ya sea un WindowsPath o un objeto PosixPath. El tipo de objeto dependerá del sistema operativo que esté utilizando. Esta característica hace que sea bastante fácil de escribir código compatible multiplataforma. Es posible pedir una WindowsPath o una PosixPath explícitamente, pero sólo se le limitarán su código para que el sistema sin ningún beneficio. Un camino concreto como este no puede ser utilizado en un sistema diferente:

>>> pathlib.WindowsPath('test.md')
NotImplementedError: cannot instantiate 'WindowsPath' on your system

Puede haber momentos en que necesita una representación de un camino que no tienen acceso al sistema de archivos subyacente (en cuyo caso también podría tener sentido para representar una ruta de Windows en un sistema que no sea Windows o viceversa). Esto se puede hacer con objetos PurePath. Estos objetos soportan las operaciones que se indican en el apartado de trayectoria componentes, pero no los métodos que el acceso al sistema de archivos:

>>> path = pathlib.PureWindowsPath(r'C:\Users\gahjelle\realpython\file.txt')
>>> path.name
'file.txt'
>>> path.parent
PureWindowsPath('C:/Users/gahjelle/realpython')
>>> path.exists()
AttributeError: 'PureWindowsPath' object has no attribute 'exists'

Puede PureWindowsPath directamente instantiate o PurePosixPath en todos los sistemas. Crear instancias de PurePath volverá uno de estos objetos en función del sistema operativo que esté utilizando.

Caminos como propio Objetos

En la introducción, se observó brevemente que los caminos no son cadenas, y una motivación detrás pathlib es para representar el sistema de archivos con objetos propios. De hecho, la documentación oficial de pathlib se titula pathlib – trayectorias del sistema de archivos orientados a objetos . El enfoque orientado a objetos ya es bastante visible en los ejemplos anteriores (especialmente si contrastarlo con la vieja manera de hacer las cosas os.path). Sin embargo, deja que te dejo con algunas otras cositas.

independientemente del sistema operativo que esté utilizando, las rutas están representados en el estilo POSIX, con la barra diagonal como separador de ruta. En Windows, verá algo como esto:

>>> pathlib.Path(r'C:\Users\gahjelle\realpython\file.txt')
WindowsPath('C:/Users/gahjelle/realpython/file.txt')

Sin embargo, cuando un camino se convierte en una cadena, se utilizará la forma nativa, por ejemplo, con barras invertidas en Windows:

>>> str(pathlib.Path(r'C:\Users\gahjelle\realpython\file.txt'))
'C:\\Users\\gahjelle\\realpython\\file.txt'

Esto es particularmente útil si está utilizando una biblioteca que no sabe cómo tratar con objetos pathlib.Path. Este es un problema mayor en las versiones de Python 3.6 antes. Por ejemplo, en Python 3.5, la biblioteca estándar ConfigParser sólo puede utilizar rutas de cuerda para leer archivos. La manera de manejar estos casos es hacer la conversión a una cadena de forma explícita:

>>> from configparser import ConfigParser
>>> path = pathlib.Path('config.txt')
>>> cfg = ConfigParser()
>>> cfg.read(path) # Error on Python < 3.6 TypeError: 'PosixPath' object is not iterable >>> cfg.read(str(path)) # Works on Python >= 3.4
['config.txt']

En Python 3.6 y más tarde se recomienda utilizar os.fspath () en lugar de str () si necesita hacer una conversión explícita. Esto es un poco más seguro, ya que generará un error si accidentalmente intenta convertir un objeto que no se pathlike.

Posiblemente la parte más inusual de la biblioteca pathlib es el uso del operador /. Para un pequeño vistazo bajo el capó, vamos a ver cómo que se implementa. Este es un ejemplo de la sobrecarga de operadores: el comportamiento de un operador se cambia dependiendo del contexto. Usted ha visto esto antes. Piense en cómo + significa cosas diferentes para cadenas y números. Python implementos sobrecarga de operadores a través del uso de doble subrayado métodos (también denominado dunder métodos ).

El / operador se define por el método .__ truediv __ (). De hecho, si se toma un vistazo al código fuente de pathlib, verá algo como:

class PurePath(object):

def __truediv__(self, key):
return self._make_child((key,))

Conclusión

Como Python 3.4, pathlib ha estado disponible en la biblioteca estándar. Con pathlib, rutas de archivos pueden ser representados por objetos camino correcto en lugar de cadenas de civil como antes. Estos objetos hacen código de tratar con rutas de archivos:

  • más fácil de leer, sobre todo porque / se utiliza para unir trazados junto
  • más potente, con la mayoría de los métodos y las propiedades necesarias disponibles directamente en el objeto
  • más consistente a través de los sistemas operativos, como peculiaridades de los diferentes sistemas están ocultas por el objeto Path

En este tutorial, que han visto cómo crear objetos de ruta, leer y archivos de escritura, manipular caminos y el sistema de archivos subyacente, así como algunos ejemplos de cómo iterar muchos caminos de archivos.

Free PDF Descargar: Python 3 Hoja de trucos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *