Search
Pár rad, jak pracovat se souborovým systémem v Pythonu.
Pravděpodobně budete chtít ve svých skriptech nějaká data načítat ze souborů nebo ukládat do souborů. Velmi často budete mít v jedné proměnné, např. fname, uloženo jméno souboru a v druhé proměnné, např. fpath, cestu, kde se má soubor nacházet. Abyste k souboru mohli přistoupit, musíte fpath a fname spojit správným oddělovačem, který se používá v OS, na němž právě pracujete. Na Unixech a Linuxech se jako oddělovač používá normální lomítko /, na Windows zpětné lomítko \, které se ovšem musí v Pythonských řetězcích zapisovat jako \\ (protože \ se používá k uvození speciálních znaků).
fname
fpath
/
\
\\
Nemusíte si ale dělat starosti s detekcí operačního systému; stačí, použijete-li funkce stadnardních balíků os a os.path. Např. proměnná os.sep obsahuje ten správný separátor, ať už jste na kterémkoli OS. Takže následující kód
os
os.path
os.sep
>>> import os >>> fpath = 'cesta_k_souboru' >>> fname = 'nazev_souboru' >>> fpath + os.sep + fname
'cesta_k_souboru\\nazev_souboru'
'cesta_k_souboru/nazev_souboru'
Můžeme také využít funkce os.path.join(). Příkaz
os.path.join()
>>> os.path.join(fpath, fname)
Váš program si bude chtít uložit nějaká data pro svou potřebu a pozdější využití. Logické umístění souboru s takovými daty je adresář, v němž se nachází váš program (příp. jeho podadresáře). Pravděpodobně vás napadne použít relativní cestu, díky níž se umístění souboru odvozuje od aktuálního adresáře. Pokud tedy z příkazové řádky, či z Pythonského interpretu spustíte svůj skript script.py, v němž zavoláte příkaz
script.py
f = open('data.txt', 'wt', encoding='utf-8')
data.txt
Problém nastává v okamžiku, kdy se váš skript script.py stane modulem, který importujete do dalších modulů a ty jej využívají. Pokud váš modul script.py importuje spuštěný skript z vyšší úrovně (“z nadřazeného adresáře”), není již aktuálním adresářem ten adresář, který obsahuje script.py, ale adresář, v němž sídlí ten skript, který byl spuštěn Pythonským interpretem. Soubor data.txt by byl vytvořen někde jinde - daleko od zamýšleného umístění.
Jak lze zajistit, aby se datový soubor vždy ukládal tam, kam chceme, tedy do stejného adresáře, kde je umístěn i náš script.py?
Pokud se soubor importuje jako modul, lze cestu k němu získat konstrukcí
fpath = os.path.dirname( os.path.abspath(__file__) )
Run
execfile()
file
Zcela univerzální postup představuje následující konstrukce využívající modul inspect:
inspect
import inspect fpath = os.path.dirname( inspect.getfile( inspect.currentframe() ) )