Dubitinsider

for your information

Hier is het probleem dat we proberen op te lossen – als je doet dit als huiswerk, zie de volledige informatie voor deze oefening:

0004-shakefiles/a.py

het Maken van de `tempdata` directory idempotently

Voor veel van de opdrachten, je zal stashing gedownloade bestanden en gegevens in een lokale map met de naam tempdata. Schrijf een Python programma om die map aan te maken. Deze functie zou “slim” genoeg moeten zijn om niet te crashen/error-out als de tempdata map al bestaat.

verwachtingen

wanneer u a.py vanaf de opdrachtregel uitvoert:

0004-shakefiles $ python a.py

  • Het programma mag niets naar het scherm uitvoeren.
  • het programma maakt dit bestandspad aan: tempdata (map)
  • het programma mag niet crashen als de tempdata map al bestaat.

mappen aanmaken met os.makedirs ()

de actie van het maken van een map is verschillend tussen verschillende besturingssystemen, bijvoorbeeld Linux VS.Windows vs. Mac OS X. dus de Python standard library os biedt een makedirs() functie.

Dit vereist het importeren van de os-module:

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

een map maken waar u bent

dus waar wordt de map aangemaakt? Waar uw script (of ipython) momenteel draait.

Als u uw script uitvoert vanaf bijvoorbeeld ~/Desktop, dan zal het volgende commando:

>>> os.makedirs("exampledirectory")

– zal een nieuwe map aanmaken op ~/Desktop/exampledirectory:

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

gebruik os.getcwd () om erachter te komen waar je bent

als je wilt weten waar je bent, heeft de module os de functie getcwd()cwd staat voor, “current working directory”):

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

mappen idempotently maken

Idempotentie verwijst naar een kwaliteit van een operatie waarin een operatie meerdere keren kan worden toegepast zonder verschillende effecten elke keer.

Hier is een voorbeeld van een niet-idempotente operatie:

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

de functie makedirs() geeft standaard een fout als u probeert een map aan te maken die al bestaat (of als u probeert een map aan te maken met hetzelfde pad als een bestand…wat zeker iets is dat u wilt vermijden)

conditioneel controleren op het bestaan van een pad

een manier om dit te omzeilen is het controleren voor het bestaan van een map/bestand voordat het wordt aangemaakt, als een voorwaardelijke Branch:

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

het exists_ok benoemde argument van de makedirs() functie

een nog gemakkelijkere manier is om het benoemde argument te gebruiken, exists_ok, van de makedirs() functie. Dit argument is optioneel omdat het een standaardwaarde heeft; standaard is exists_ok ingesteld op False – dat wil zeggen dat het niet goed zal zijn als u makedirs gebruikt om een reeds bestaand pad aan te maken.

echter, het instellen van exists_ok naar True bij het aanroepen van makedirs() zal voorkomen dat een foutmelding wordt gegooid:

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

dus dat is hoe u eenvoudig mappen en submappen in Python met makedirs().

de vele functies en submodules van de os module

de os module heeft veel nuttige hulpprogramma ‘ s die we zullen gebruiken om de bestanden te organiseren waarvan we lezen en schrijven. In een latere Les gebruiken we het besturingssysteem.path submodule

Maar Ik zal hier wat tijd nemen om u vertrouwd te maken met de os.path.join() functie en het probleem dat het oplost.

inconsistentie van bestandspad tussen Windows en OS X

We gaan veel te maken hebben met bestanden die zijn opgeslagen op onze computers en, door noodzaak, zullen we te maken hebben met hun paden, dat wil zeggen de tekstreeksen die de volgende submappen beschrijven om daadwerkelijk naar een specifiek bestand te komen. Maar dit is ingewikkeld bij het omgaan met verschillende besturingssystemen.

Op OS X – en alle andere Unix-gebaseerde systemen zoals Linux, bestandspaden worden weergegeven als tekst in dit formaat, met forward slashes het afbakenen van de submappen en de werkelijke bestandsnaam op – in dit geval file.txt:

my/path/to/file.txt

In Windows, de backslash wordt gebruikt:

\my\path\to\file.txt

Als u al aandacht te besteden aan wat de backslash-teken betekent voor Python snaren, misschien herinner je je nog dat het fungeert als een escape-reeks – dat wil zeggen de backslash wijzigt de betekenis van de token (d.w.z. teken) die erop volgt. Dit betekent dat als u een letterlijke backslash in een Python-tekenreeks wilt afdrukken, u dubbele backslashes moet gebruiken:

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

zoals u zich kunt voorstellen, kan dit de mogelijkheid om code te schrijven die werkt op Windows en overal anders bemoeilijken.

het besturingssysteem.pad.join () functie

we krijgen toegang tot het besturingssysteem.padmodule als we import os in onze code hebben.

het besturingssysteem.pad.join () Functie Neemt zoveel argumenten die nodig zijn om een opgegeven bestandspad te genereren, waarbij elk argument één component (dwz subdirectory) van het pad vertegenwoordigt. Dus in plaats van dit te doen:

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

We doen dit:

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

en of u code draait op Windows-of Unix-gebaseerde systemen, het werkelijke pad naar het bestand zal consistent zijn.

submappen maken met makedirs ()

We hoeven nog geen geneste submappen te maken – dat wil zeggen submappen binnen submappen, bijvoorbeeld somedir/subdir/subsubdir maar ik gebruik het gewoon als een voorbeeld van een real-world scenario dat we later zullen tegenkomen.

de functie makedirs() maakt recursief mappen aan. Dat is, als u wilt maken van een geneste map:

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

– het omgaan met de schepping van de nodige bovenliggende mappen:

ten Eerste:

my

Hierna:

my└── fun

Vervolgens:

my└── fun └── new

– voor het maken van de actuele directory die u hebt opgegeven, d.w.z. my/fun/new/directory:

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

Dit is heel handig. En een mooie use case voor os.path.join():

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

we krijgen wat feitelijk gebruik van os.path.join in de next_lesson

als je geïnteresseerd bent in waarom dingen verschillen tussen besturingssystemen…nou, zoals alles in het leven, komt het neer op verschillende mensen en bedrijven die verschillende dingen creëren op verschillende tijdstippen in verschillende contexten.

dus waarom is Windows het oneven besturingssysteem uit? Het is allemaal te wijten aan een paar ongelukken uit de geschiedenis die decennia geleden gebeurde.

Unix introduceerde het forward slash — teken — dat is het / – teken-als het directory scheidingsteken rond 1970. We weten niet echt waarom ze deze kozen, maar dat is degene die ze kozen.

het is moeilijk voor te stellen vandaag, maar de originele versie van Microsoft DOS — dat is MS-DOS 1.0 — ondersteunde helemaal geen directory ’s toen het in 1981 werd vrijgegeven…MS-DOS 2.0 introduceerde ondersteuning voor directory’ s, maar IBM wilde compatibiliteit met de originele DOS-nutsbedrijven en andere programma ‘ s houden die het / karakter voor switches verwachtten te worden gebruikt. Microsoft had het / teken al ergens voor gebruikt, dus ze konden het niet zomaar hergebruiken.

uiteindelijk kozen ze in plaats daarvan het \ – teken, omdat het visueel het meest op elkaar lijkende teken was.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.