Tady je problém se snažíme vyřešit – pokud to děláš jako domácí úkol, viz úplné informace pro toto cvičení:
0004-shakefiles/a.py
Pro mnoho úkolů, budete být stashing stažené soubory a data do lokálního adresáře s názvem tempdata
. Napište program Python a vytvořte tento adresář. Tato funkce by měla být dostatečně „chytrá“, aby nedošlo k selhání / chybě, pokud adresář tempdata
již existuje.
Při spuštění a.py
z příkazového řádku:
0004-shakefiles $ python a.py
- program by neměl výstup cokoliv na obrazovce.
- program vytvoří tento soubor path:
tempdata
(adresáři) -
program nesmí selhat, pokud
tempdata
adresář již existuje.
vytváření adresářů s os.makedirs()
akční vytvoření adresáře se liší napříč různými operačními systémy, například Linux vs. Windows vs. Mac OS X. Takže Python standardní knihovna os
nabízí makedirs()
funkce.
to vyžaduje import modulu os:
>>> import os>>> os.makedirs("mynewdirectory")
vytvoření adresáře, kde jste
takže kde se adresář vytvoří? Kdekoli je váš skript (nebo ipython) právě spuštěn.
Pokud spustíte skript z, řekněme ~/Desktop
, pak následující příkaz:
>>> os.makedirs("exampledirectory")
– vytvoří nový adresář na ~/Desktop/exampledirectory
:
Desktop ## <== YOU ARE HERE├── exampledirectory
Použití os.getcwd (), aby zjistili, kde jste
Pokud potřebujete vědět, kde jste, os
modul getcwd()
funkce (cwd
stojí za to, „aktuální pracovní adresář“):
>>> os.getcwd()/Users/dtown/Desktop
vytváření adresářů idempotently
Idempotence označuje kvalitu operace, při které lze operaci použít vícekrát bez různých efektů pokaždé.
zde je příklad neidempotentní operace:
>>> os.makedirs("oopsie")>>> os.makedirs("oopsie")FileExistsError: File exists: 'oopsie'
makedirs()
funkce vyvolá chybu ve výchozím nastavení, pokud se pokusíte vytvořit adresář, který již existuje (nebo, pokud se pokusíte vytvořit adresář se stejnou cestou jako soubor…což je rozhodně něco, co chcete vyhnout)
Podmíněně kontrola existence cestu
Jeden způsob, jak obejít toto je zkontrolovat existenci adresáře/souboru, než se snaží vytvořit to, jako podmíněné větev:
>>> if not os.path.exists('oopsie'):... os.makedirs('oopsie')
exists_ok pojmenovaný argument makedirs() funkce
ještě jednodušší způsob je použít pojmenovaný argument, exists_ok
makedirs()
funkce. Tento argument je nepovinný, protože to má výchozí hodnotu; ve výchozím nastavení exists_ok
je nastavena na False
– tj. to nebude OK, pokud se pokusíte použít makedirs
vytvořit již existující cesty.
Nicméně, nastavení exists_ok
True
při volání makedirs()
zabrání se chybová zpráva od být vyvolána:
>>> os.makedirs("oopsie", exist_ok = True)>>> os.makedirs("oopsie", exist_ok = True)# no error message is thrown...
Takže to je to, jak můžete snadno vytvářet adresáře a podadresáře v Pythonu s makedirs()
.
mnoho funkcí a dílčích modulů os modulu
os
module má mnoho užitečných nástrojů, které budeme používat, aby organizovat soubory, které jsme číst a psát. V pozdější lekci budeme používat operační systém.path submodule
ale budu trvat nějaký čas, abych vás seznámil s funkcí os.path.join()
a problémem, který řeší.
cesta k Souboru nesoulad mezi Windows a OS X
Budeme mít co dočinění s hodně soubory uložené na našich počítačích, a nutností, budeme se zabývat jejich cesty, tj. textové řetězce, které popisují další podadresáře, aby skutečně dostat na konkrétní soubor. To je však komplikované při práci s různými operačními systémy.
Na OS X a jiné Unix-založené systémy, jako jsou Linux, cesty souborů jsou reprezentovány jako textové řetězce v tomto formátu, s dopředu lomítka vymezení podadresářů a skutečným názvem – v tomto případě, file.txt
:
my/path/to/file.txt
V systému Windows, zpětné lomítko se používá:
\my\path\to\file.txt
Pokud jste nevěnoval pozornost na to, co znak zpětného lomítka znamená pro řetězce v Pythonu, možná si vzpomenete, že to funguje jako escape sekvence – tj. zpětné lomítko mění význam tokenu (tj. znak), která následuje. To znamená, že k tisku doslovný zpětné lomítko v Python řetězce, budete muset použít dvojitá zpětná lomítka:
>>> print("\\my\\path\\to\\file.txt")\my\path\to\file.txt
Jak si dokážete představit, že by mohlo zkomplikovat schopnost psát kód, který funguje na Windows a všude jinde.
os.cesta.join () funkce
získáme přístup k os.modul cesty, pokud máme v našem kódu import os
.
os.cesta.funkce join () má tolik argumentů potřebných ke generování zadané cesty k souboru, přičemž každý argument představuje jednu složku (tj. Takže místo toho, aby to udělal:
mypath = "my/path/to/file.txt"
:
mypath = os.path.join('my', 'path', 'to', 'file.txt')
A to, zda používáte kód na Windows nebo Unix-založené systémy, skutečná cesta k souboru, budou v souladu.
Vytvořit podadresáře s makedirs()
nemusíme dělat vnořené podadresáře přesto – tj. podadresáře v podadresářích, např. somedir/subdir/subsubdir
, ale použil jsem to jako příklad v reálném světě scénář, který budeme později narazíte.
funkce makedirs()
rekurzivně vytváří adresáře. To znamená, že pokud chcete vytvořit vnořené adresáře:
>>> os.makedirs("my/fun/new/directory")
– to se postará o vytvoření potřebných nadřazené adresáře:
:
my
:
my└── fun
, Pak:
my└── fun └── new
– před vytvořením aktuální adresář, který jste zadali, tj. my/fun/new/directory
:
my└── fun └── new └── directory
To je docela pohodlné. A pěkný případ použití pro os.path.join()
:
import osmypath = os.path.join("my", "fun", "new", "directory")makedirs(mypath)
Budeme mít nějaké skutečné používání os.path.join
v next_lesson
Pokud vás zajímá, proč se věci se liší mezi operačními systémy…no, jako všechno v životě, to přijde dolů pro různé lidi a firmy, vytváření různých věcí v různých časech v různých kontextech.
tak proč je Windows zvláštní operační systém ven? Je to všechno až na několik nehod historie, které se staly před desítkami let.
Unix zavedl znak lomítka-to je znak / – jako oddělovač adresářů kolem roku 1970. Opravdu nevíme, proč si vybrali tenhle, ale to je ten, který si vybrali.
je těžké si představit dnes, ale původní verze Microsoft DOS — MS-DOS 1.0 — nevěděl, podpora adresářů, když to bylo propuštěno v roce 1981…MS-DOS 2.0 zavedena podpora pro adresáře, ale IBM chtěla udržet kompatibilitu s původní DOS utilit a dalších programů, které očekával / znak, které mají být použity pro přepínače. Microsoft již použil znak / pro něco, takže jej nemohli znovu použít.
nakonec zvolili místo toho znak \ , protože to byl vizuálně nejpodobnější znak.