Dubitinsider

for your information

Hier ist das Problem, das wir zu lösen versuchen – wenn Sie dies als Hausaufgabe tun, lesen Sie die vollständigen Informationen zu dieser Übung:

0004-shakefiles/a.py

Erstellen Sie das Verzeichnis idempotently

Für viele der Aufgaben werden Sie heruntergeladene Dateien und Daten in einem lokalen Verzeichnis mit dem Namen tempdata . Schreiben Sie ein Python-Programm, um dieses Verzeichnis zu erstellen. Diese Funktion sollte „intelligent“ genug sein, um nicht abzustürzen, wenn das Verzeichnis tempdata bereits vorhanden ist.

Erwartungen

Wenn Sie a.py über die Befehlszeile ausführen:

0004-shakefiles $ python a.py

  • Das Programm sollte nichts auf dem Bildschirm ausgeben.
  • Das Programm erstellt diesen Dateipfad: tempdata (Verzeichnis)
  • Das Programm darf nicht abstürzen, wenn das tempdata Verzeichnis bereits existiert.

Erstellen von Verzeichnissen mit os.makedirs()

Die Aktion zum Erstellen eines Verzeichnisses ist unter verschiedenen Betriebssystemen unterschiedlich, z. B. Linux vs. Windows vs. Mac OS X. Daher bietet die Python-Standardbibliothek os eine makedirs() Funktion.

Dazu muss das Betriebssystemmodul importiert werden:

>>> import os>>> os.makedirs("mynewdirectory")

Erstellen Sie ein Verzeichnis, in dem Sie sich befinden

Wo wird das Verzeichnis erstellt? Wo immer Ihr Skript (oder ipython) gerade ausgeführt wird.

Wenn Sie Ihr Skript beispielsweise von ~/Desktop ausführen, wird der folgende Befehl ausgeführt:

>>> os.makedirs("exampledirectory")

– erstellt ein neues Verzeichnis unter ~/Desktop/exampledirectory:

Desktop ## <== YOU ARE HERE├── exampledirectory 

Verwenden Sie os.getcwd() um herauszufinden, wo Sie sind

Wenn Sie wissen müssen, wo Sie sind, hat das os Modul die getcwd() Funktion (cwd steht für „aktuelles Arbeitsverzeichnis“):

>>> os.getcwd()/Users/dtown/Desktop 

Verzeichnisse idempotent machen

Idempotenz bezieht sich auf eine Qualität einer Operation, bei der eine Operation mehrmals ohne unterschiedliche Effekte angewendet werden kann.

Hier ist ein Beispiel für eine nicht-idempotente Operation:

>>> os.makedirs("oopsie")>>> os.makedirs("oopsie")FileExistsError: File exists: 'oopsie'

Die makedirs() -Funktion gibt standardmäßig einen Fehler aus, wenn Sie versuchen, ein bereits vorhandenes Verzeichnis zu erstellen (oder wenn Sie versuchen, ein Verzeichnis mit demselben Pfad wie eine Datei zu erstellen … was Sie definitiv vermeiden möchten)

Bedingtes Überprüfen auf das Vorhandensein eines Pfads

Eine Möglichkeit, dies zu umgehen, besteht darin, die überprüfen Sie das Vorhandensein eines Verzeichnisses / einer Datei, bevor Sie versuchen, es als bedingten Zweig zu erstellen:

>>> if not os.path.exists('oopsie'):... os.makedirs('oopsie')

Das exists_ok benannte Argument der Funktion makedirs()

Ein noch einfacherer Weg ist die Verwendung des benannten Arguments exists_ok der Funktion makedirs(). Standardmäßig ist exists_ok auf False – dh es ist nicht in Ordnung, wenn Sie versuchen, makedirs , um einen bereits vorhandenen Pfad zu erstellen.

Das Setzen von exists_ok auf True beim Aufruf von makedirs() verhindert jedoch, dass eine Fehlermeldung ausgegeben wird:

>>> os.makedirs("oopsie", exist_ok = True)>>> os.makedirs("oopsie", exist_ok = True)# no error message is thrown...

So erstellen Sie ganz einfach Verzeichnisse und Unterverzeichnisse in Python mit makedirs().

Die vielen Funktionen und Submodule des Os-Moduls

Das os -Modul verfügt über viele nützliche Dienstprogramme, mit denen wir die Dateien organisieren, aus denen wir lesen und schreiben. In einer späteren Lektion werden wir das Betriebssystem verwenden.path submodule

Aber ich werde mir hier etwas Zeit nehmen, um Sie mit der os.path.join() Funktion und dem Problem, das sie löst, vertraut zu machen.

Dateipfad-Inkonsistenz zwischen Windows und OS X

Wir werden viel mit Dateien zu tun haben, die auf unseren Computern gespeichert sind, und wir werden uns notwendigerweise mit ihren Pfaden befassen, dh den Textzeichenfolgen, die die nächste von Unterverzeichnissen beschreiben, um tatsächlich zu einer bestimmten Datei zu gelangen. Dies ist jedoch kompliziert, wenn Sie mit verschiedenen Betriebssystemen arbeiten.

Unter OS X – und allen anderen Unix-basierten Systemen wie Linux – werden Dateipfade in diesem Format als Textzeichenfolgen dargestellt, wobei Schrägstriche die Unterverzeichnisse und den tatsächlichen Dateinamen begrenzen – in diesem Fall file.txt:

my/path/to/file.txt

In Windows wird der Backslash verwendet:

\my\path\to\file.txt

Wenn Sie darauf geachtet haben, was das Backslash–Zeichen für Python-Zeichenfolgen bedeutet, erinnern Sie sich vielleicht daran, dass es als Escape-Sequenz fungiert – dh der Backslash ändert die Bedeutung des Tokens (dh des Zeichens), das darauf folgt. Dies bedeutet, dass Sie zum Drucken eines literalen Backslashs in einer Python-Zeichenfolge doppelte Backslashes verwenden müssen:

>>> print("\\my\\path\\to\\file.txt")\my\path\to\file.txt

Wie Sie sich vorstellen können, könnte dies die Möglichkeit erschweren, Code zu schreiben, der unter Windows und überall sonst funktioniert.

Das Betriebssystem.Pfad.join() Funktion

Wir erhalten Zugriff auf das Betriebssystem.pfadmodul, wenn wir import os in unserem Code haben.

Das Betriebssystem.Pfad.die Funktion join() benötigt so viele Argumente, wie zum Generieren eines angegebenen Dateipfads erforderlich sind, wobei jedes Argument eine Komponente (dh ein Unterverzeichnis) des Pfads darstellt. Also anstatt das zu tun:

mypath = "my/path/to/file.txt"

Wir tun dies:

mypath = os.path.join('my', 'path', 'to', 'file.txt')

Und unabhängig davon, ob Sie Code auf Windows- oder Unix-basierten Systemen ausführen, ist der tatsächliche Pfad zur Datei konsistent.

Erstellen von Unterverzeichnissen mit makedirs()

Wir müssen noch keine verschachtelten Unterverzeichnisse erstellen – dh Unterverzeichnisse innerhalb von Unterverzeichnissen, zB somedir/subdir/subsubdir aber ich verwende es nur als Beispiel für ein reales Szenario, dem wir später begegnen werden.

Die makedirs() Funktion erstellt rekursiv Verzeichnisse. Das heißt, wenn Sie ein verschachteltes Verzeichnis erstellen möchten:

>>> os.makedirs("my/fun/new/directory")

– es wird die Erstellung der erforderlichen übergeordneten Verzeichnisse übernehmen:

Zuerst:

my

Dann:

my└── fun

Dann:

my└── fun └── new

– bevor Sie das eigentliche Verzeichnis erstellen, das Sie angegeben haben, dh my/fun/new/directory:

my└── fun └── new └── directory

Das ist ziemlich praktisch. Und ein schöner Anwendungsfall für os.path.join():

import osmypath = os.path.join("my", "fun", "new", "directory")makedirs(mypath)

Wir werden einige tatsächliche Verwendung von os.path.join in der next_lesson

Wenn Sie daran interessiert sind, warum die Dinge zwischen Betriebssystemen unterschiedlich sind … nun, wie alles im Leben kommt es darauf an, dass verschiedene Menschen und Unternehmen verschiedene Dinge zu verschiedenen Zeiten in verschiedenen Kontexten erstellen.

Warum ist Windows das seltsame Betriebssystem? Es ist alles auf ein paar Unfälle der Geschichte zurückzuführen, die vor Jahrzehnten passiert sind.

Unix führte um 1970 den Schrägstrich — das ist das Zeichen / — als Verzeichnistrennzeichen ein. Wir wissen nicht wirklich, warum sie diesen gewählt haben, aber das ist derjenige, den sie ausgewählt haben.

Es ist heute schwer vorstellbar, aber die ursprüngliche Version von Microsoft DOS — das ist MS-DOS 1.0 — unterstützte Verzeichnisse überhaupt nicht, als es 1981 veröffentlicht wurde … MS-DOS 2.0 führte Unterstützung für Verzeichnisse ein, aber IBM wollte die Kompatibilität mit den ursprünglichen DOS-Dienstprogrammen und anderen Programmen beibehalten, die erwarteten, dass das Zeichen / für Switches verwendet wird. Microsoft hatte das Zeichen / bereits für etwas verwendet, sodass sie es nicht einfach wiederverwenden konnten.

Letztendlich wählten sie stattdessen das Zeichen \, da es visuell das am ähnlichsten aussehende Zeichen war.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.