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.
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']
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')
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