Pathlib, das aus Python3.4 eingeführt wurde, ist grob in mehrere Betriebssysteme, Betriebssystempfade, Globs usw. unterteilt. Es kann gesagt werden, dass es sich um eine Sammlung von Pfadoperationen handelt, die in den Modulen von verteilt sind. Es ist bequem, es zu haben, aber der Eindruck ist, dass Sie sich darüber keine Sorgen machen müssen.
Sollte ich vorerst nur "Anzeigeverzeichnisse / -dateien unter dem angegebenen Verzeichnis" verwenden, die ich häufig verwende?
Verzeichnis unter dem angegebenen Verzeichnis/Dateianzeige(pathlib)
>>> from pathlib import Path
>>> p = Path('.')
>>> a = list(p.glob('**/*'))
>>> a
[PosixPath('.gitkeep'), PosixPath('css'), PosixPath('css/style.css')]
Wenn Sie (fast) eine ähnliche Verarbeitung in ein vorhandenes Modul schreiben, wird dies so sein.
Verzeichnis unter dem angegebenen Verzeichnis/Dateianzeige(Vorhandenes Modul)
#Verwenden Sie das OS-Modul. Im Gegensatz zur pathlib-Version wird der angegebene Pfad eingegeben. Wenn Sie also betroffen sind, können Sie root und path vergleichen und ausschließen.
#Es gibt kein besonderes Problem, aber es ist lang...
>>> 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']
#Verwenden Sie das Glob-Modul. Punktedateien können nicht aufgenommen werden, oder Verzeichnisse in der Mitte können nicht aufgenommen werden.
>>> import glob
>>> glob.glob('**/*')
['css/style.css']
Ein kleines Merkmal ist, dass Sie Pfade mit dem Operator / kombinieren können. Dies kann nicht nur mit Pfaden, sondern auch mit Zeichenketten erfolgen.
Pfadverknüpfung
>>> p = Path('test')
>>> p2 = Path('test2')
>>> p/p2 #Wege
PosixPath('test/test2')
>>> p/'test3' # Path/String
PosixPath('test/test3')
>>> 'test4'/p #String/Path
PosixPath('test4/test')
Wenn Sie sich die cpython-Implementierung ansehen, sehen Sie, dass die dem Operator / entsprechenden Methoden (\ __ truediv__ und \ __ rturediv__) implementiert sind. (ref. https://docs.python.org/3/reference/datamodel.html#emulating-numeric-types)
Implementierung von Path Join
class PurePath(object):
..
#Pfade, Pfade/Wenn es sich um eine Zeichenfolge handelt, wird sie aufgerufen
def __truediv__(self, key):
return self._make_child((key,))
#String/Im Fall von Path heißt es
def __rtruediv__(self, key):
return self._from_parts([key] + self._parts)
Diese Spezifikation hier scheint ziemlich kritisch zu sein, wenn man sie betrachtet ... Persönlich werde ich es wahrscheinlich versehentlich hinzufügen.
Beispiele, die persönlich falsch sein können
>>> 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
Anstatt den Operator / zu verwenden, ist es meiner Meinung nach besser, nicht zu zögern, alles als Pfad zu verarbeiten.
Gründlich, wenn Sie es trotzdem benutzen
>>> p = Path('test')
>>> p2 = Path('test2')
>>> p3 = Path('test3')
#Ein neuer Pfad kann aus einer beliebigen Anzahl von Pfaden generiert werden
>>> Path(p, p2, p3)
PosixPath('test/test2/test3')
Wie bei enum, das ich am Vortag erwähnt habe, können Sie Bibliotheken von Drittanbietern mit pip installieren. (Python 2.7 oder höher)
python
% pip search pathlib
pathlib - Object-oriented filesystem paths