[PYTHON] Pathlib fournit une interface commune pour les opérations de chemin de fichier

Pathlib introduit à partir de Python3.4 est grossièrement divisé en plusieurs os, os.path, glob, etc. On peut dire qu'il s'agit d'un ensemble d'opérations de chemin dispersées dans les modules de. C'est pratique de l'avoir, mais l'impression est que vous n'avez pas à vous en soucier.

Afficher les répertoires / fichiers sous le répertoire spécifié

Pour le moment, dois-je simplement utiliser "afficher les répertoires / fichiers sous le répertoire spécifié", que j'utilise souvent?

Répertoire sous le répertoire spécifié/Affichage des fichiers(pathlib)


>>> from pathlib import Path
>>> p = Path('.')
>>> a = list(p.glob('**/*'))
>>> a
[PosixPath('.gitkeep'), PosixPath('css'), PosixPath('css/style.css')]

Si vous écrivez un traitement (presque) similaire dans un module existant, ce sera comme ça.

Répertoire sous le répertoire spécifié/Affichage des fichiers(Module existant)


#Utilisez le module os. Contrairement à la version pathlib, le chemin spécifié est entré, donc si vous êtes concerné, vous pouvez comparer la racine et le chemin et les exclure.
#Il n'y a pas de problème particulier, mais c'est long...
>>> import os
>>> def _walk(path):
    for root, dirs, files in os.walk(path):
        yield root
        for f in files:
            yield os.path.join(root, f)
>>> a = list(_walk('.'))
>>> a
['.', './.gitkeep', './css', './css/style.css']

#Utilisez le module glob. Les fichiers de points ne peuvent pas être ramassés ou les répertoires du milieu ne peuvent pas être ramassés.
>>> import glob
>>> glob.glob('**/*')
['css/style.css']

Rejoindre le chemin

Une petite caractéristique est que vous pouvez combiner Paths avec l'opérateur /. Cela peut être fait non seulement avec les chemins, mais aussi avec des chaînes de caractères.

Jointure de chemin


>>> p = Path('test')
>>> p2 = Path('test2')
>>> p/p2 #Les chemins
PosixPath('test/test2')
>>> p/'test3' # Path/Chaîne
PosixPath('test/test3')
>>> 'test4'/p #Chaîne/Path
PosixPath('test4/test')

En regardant l'implémentation de cpython, vous pouvez voir que les méthodes correspondant à l'opérateur / (\ __ truediv__ et \ __ rturediv__) sont implémentées. (ref. https://docs.python.org/3/reference/datamodel.html#emulating-numeric-types)

Implémentation de la jonction de chemin


class PurePath(object):
..
    #Chemins, chemins/S'il s'agit d'une chaîne, elle est appelée
    def __truediv__(self, key):
        return self._make_child((key,))

    #Chaîne/Dans le cas de Path, il est appelé
    def __rtruediv__(self, key):
        return self._from_parts([key] + self._parts)

Cette spécification, ici semble être assez critiquée quand on la regarde ... Personnellement, je vais probablement l'ajouter par erreur.

Exemples qui peuvent se tromper personnellement


>>> p = Path('test')
>>> 'test2' + p
Traceback (most recent call last):
  File "<ipython-input-8-22275bd1c6c1>", line 1, in <module>
    'test2' + p
TypeError: Can't convert 'PosixPath' object to str implicitly

Donc, plutôt que d'utiliser l'opérateur /, je pense qu'il vaut mieux ne pas hésiter à tout traiter comme Path.

À fond si vous l'utilisez quand même


>>> p = Path('test')
>>> p2 = Path('test2')
>>> p3 = Path('test3')
#Un nouveau chemin peut être généré à partir de n'importe quel nombre de chemins
>>> Path(p, p2, p3)
PosixPath('test/test2/test3')

Rétrocompatible

Comme enum, que j'ai mentionné la veille, vous pouvez installer des bibliothèques tierces avec pip. (Python 2.7 ou version ultérieure)

python


% pip search pathlib
pathlib                   - Object-oriented filesystem paths

Recommended Posts

Pathlib fournit une interface commune pour les opérations de chemin de fichier
Commandes de base pour les opérations sur les fichiers
Package Filer pour des opérations simples sur les fichiers
Obtenez le chemin du fichier à l'aide de Pathlib
Opération de fichier
J'ai créé un fichier de dictionnaire python pour Neocomplete