[PYTHON] Pathlib bietet eine gemeinsame Schnittstelle für Dateipfadoperationen

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.

Verzeichnisse / Dateien unter dem angegebenen Verzeichnis anzeigen

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

Pfad verbinden

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

Rückwärtskompatibel

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

Recommended Posts

Pathlib bietet eine gemeinsame Schnittstelle für Dateipfadoperationen
Grundlegende Befehle für Dateivorgänge
Package Filer für einfache Dateivorgänge
Holen Sie sich den Dateipfad mit Pathlib
Dateivorgang
Ich habe eine Python-Wörterbuchdatei für Neocomplete erstellt