7 начина да проверите да ли датотека или фасцикла постоје у Питхон-у

Питхон стандардна библиотека садржи већину функционалности које би програмеру требале да реши проблем. У овом водичу ћете научити различите начине да проверите постојање датотеке или директоријума користећи само уграђене модуле.

Провера да ли је датотека или скрипта на правом месту је кључна за сваки ЦЛИ програм. Ваш програм може постати бескористан ако одређена датотека није на месту у тренутку извршења.

У данашњем водичу ћете научити неке брзе начине да проверите да ли датотека или фасцикла постоји у Питхон-у.

Пре почетка

Пре него што извршите било коју команду у наставку, уверите се да је Питхон 3 инсталиран у вашем систему. Отворите свој терминал и откуцајте следећу команду:

python --version
# Python 3.9.5, my result

Ако имате верзију 2.к, мораћете да користите команду „питхон3“. Погледајте наш водич за инсталацију Питхон-а ако немате инсталиран Питхон 3.

Користићемо неке тест датотеке заједно са овим водичем, па се побрините да направите следеће датотеке:

touch testfile.txt
mkdir testdirectory/ 
touch testdirectory/otherfile.txt

Горње команде креирају датотеку за играње, директоријум за тестирање и другу датотеку унутар директоријума за тестирање. Датотеке могу бити празне јер нећемо морати да читамо њихов садржај,

Напомена: Ако користите Виндовс, подесите једноставну структуру датотеке помоћу графичког менаџера датотека.

Коначно, користићемо Ипитхон као наша интерактивна Питхон шкољка која даје леп интерфејс за рад. Ово је само роба, стога није стриктно неопходна.

pip install ipython

Након што ово урадите, добићете приступ прелепој Питхон љусци само тако што ћете укуцати ипитхон.

Сада сте спремни, хајде да заронимо у начине да проверимо да ли фасцикла или датотека постоји у Питхон-у.

Покушајте, отворите и осим

Ово је најједноставнија опција. Ако покушате да отворите датотеку која не постоји, Питхон ће покренути а ФилеНотФоундЕррор.

In [1]: open('im-not-here.txt')
---------------------------------------------------------------------------
FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'

Можемо да искористимо ово и обрадимо изузетак у случају да датотека коју тражимо не постоји.

In [2]: try:
   ...:     file = open('im-not-here.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn' exist')
   ...:     exit()
   ...: 
Sorry the file we're looking for doesn't exist

У коду изнад штампамо прилагођену поруку и заустављамо извршавање програма ако датотека не постоји.

  Исправите грешку у Пхотосхопу није могао да доврши ваш захтев

Обратите пажњу на то како ће се функција екит() извршити само ако се појави изузетак. Хајде да видимо шта се дешава када датотека коју тражимо заиста постоји.

In [2]: try:
   ...:     file = open('testfile.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn't exist')
   ...:     exit()
   ...: 
<_io.TextIOWrapper name="testfile.txt" mode="r" encoding='UTF-8'>

Обратите пажњу на то како затварамо датотеку одмах након што смо је отворили. Сматра се добром праксом према Питхон документација.

Позивање <спан цласс=”пре”>филе.врите() без употребе кључне речи <спан цласс=”пре”>витх или позивања <спан цласс=”пре”>филе.цлосе() може довести до тога да аргументи <спан цласс=”пре”>филе.врите() не буду у потпуности уписани на диск, чак и ако се програм успешно затвори.

Чак и ако не пишемо у датотеку, изузетно је препоручљиво затворити датотеку јер би то могло довести до више проблема са перформансама.

Ако не желимо сами да затворимо датотеку, могли бисмо да користимо са менаџером контекста. Прецизно додељује и ослобађа ресурсе, тако да нећемо морати да затворимо датотеку.

In [3]: try:
   ...:     with open('testfile.txt') as file:
   ...:         print(file)
   ...:         # No need to close the file
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn't exist')
   ...:     exit()
   ...: 
   ...: 
<_io.TextIOWrapper name="testfile.txt" mode="r" encoding='UTF-8'>

Овај метод је изузетно користан када се пише у датотеке, али је неефикасан ако желимо само да проверимо да ли датотека постоји. Хајде да заронимо у друге опције да то постигнемо.

ос.патх.екистс()

Тхе ос модул пружа више функција за интеракцију са оперативним системом. Да бисмо проверили да ли датотека или фасцикла постоји, можемо користити функцију патх.екистс() која прихвата путању до датотеке или директоријума као аргумент. Враћа логичку вредност на основу постојања путање.

Напомена: Путања је јединствена локација датотеке или директоријума у ​​систему датотека

У Питхон-у, ос.патх подмодул садржи функције искључиво дизајниране за рад са путањама датотека. Све ове функције прихватају аргумент путање као низове или бајтове, а ви можете одлучити да радите са апсолутним путањама, на пример:

/home/daniel/.bashrc

Или са релативним путањама, у зависности од директоријума у ​​ком покрећете скрипту:

.bashrc
# Running the script in my home folder

Ево више примера који користе функцију ос.патх.екистс(), која се покреће у директоријуму у којем се налазе моји фајлови за тестирање:

In [1]: import os

In [2]: os.path.exists('testfile.txt')
Out[2]: True

In [3]: os.path.exists('testdirectory')
Out[3]: True

In [4]: os.path.exists('hey-i-dont-exist')
Out[4]: False

Као што видите, враћа Труе када се тестира са тестфиле.ткт датотеком и директоријумом теста, а Фалсе када датотека не постоји.

  Како да искључите закључавање тастатуре Логитецх

ос.патх.исфиле()

Ако желите само да докажете постојање датотеке (не директоријума), позвали бисте функцију ос.патх.исфиле().

In [1]: import os

In [2]: os.path.isfile('testfile.txt')
Out[2]: True

In [3]: os.path.isfile('testdirectory/')
Out[3]: False

In [4]: os.path.isfile('i-dont-even-exist')
Out[4]: False

In [5]: os.path.isfile('testdirectory/otherfile.txt')
Out[5]: True

Напомена: У УНИКС-у се сви директоријуми завршавају косом цртом унапред (/), док у Виндовс-у користимо обрнуту косу црту ().

У коду изнад исфиле() функција враћа Фалсе у два наврата, да видимо зашто:

  • тестдирецтори/ је директоријум, стога се не сматра датотеком. Ово није апсолутно тачно јер у Линуку све је дескриптор датотекеали Питхон другачије третира директоријуме само ради погодности (ако покушате да отворите директоријум, добићете ИсАДирецториЕррор)
  • и-донт-евен-екист указује на датотеку која иронично не постоји

ос.патх.исдир()

Ако желите да проверите да ли је директоријум на правом месту, мораћете да користите функцију ос.патх.исдир(), која враћа Труе само ако дата путања указује на директоријум.

In [1]: import os

In [2]: os.path.isdir('testfile.txt')
Out[2]: False

In [3]: os.path.isdir('testdirectory')
Out[3]: True

In [4]: os.path.isdir('anotherfile.txt')
Out[4]: False

Обратите пажњу на то како горњи примери враћају Фалсе чак и када путања указује на датотеку која постоји.

Глоб

Тхе глоб модул пружа функције за рад Уник шаблони слични љусци (због тога не ради исправно на Виндовс-у). Да бисте проверили да ли датотека одговара шаблону унутар тренутног директоријума, можете користити глоб.глоб() функција.

In [1]: import glob

In [2]: glob.glob('testfile.txt')
Out[2]: ['testfile.txt']

In [3]: glob.glob('testdirectory')
Out[3]: ['testdirectory']

У коду изнад, образац прослеђен функцији глоб је нормалан стринг који представља путању до тест датотеке и директоријума. Пошто постоје обе путање, функција враћа листу са одговарајућим именима путања унутар ње.

Напомена: Ако се образац не подудара, добићете празну листу.

С обзиром да можемо да пренесемо обрасце у функцију глоб, зашто не тестирати неке од њених главних предности?

Код у наставку добија све путање датотека са екстензијом .ткт и .пи респективно:

In [4]: glob.glob('*.txt')
Out[4]: ['testfile.txt']

In [5]: glob.glob('*.py')
Out[5]: 
['pathlib-exists.py',
 'list-dir.py',
 'glob-file.py',
 'open-except.py',
 'subprocess-test.py',
 'isfile.py',
 'exists.py',
 'isdir.py']

Коришћење класе Патх

Тхе Класа путање је један од најбољих начина за рад са путањама јер нам даје чист интерфејс за рад са путањама датотека као објектима.

Главна ствар је да инстанце путање имају све методе које су вам потребне да бисте добили информације о одређеној путањи. Ово укључује функције сличне претходним опцијама.

Напомена: Биће вам потребан Питхон 3.4 или новији да бисте користили библиотеку патхлиб

  Интел Мац рачунари у односу на Аппле Силицон АРМ Мац рачунари: Шта да купите?

Методе путање које ћете користити:

Проверите да ли постоји путања

In [1]: from pathlib import Path

In [2]: Path('testfile.txt').exists()
Out[2]: True

In [3]: Path('im-not-here.txt').exists()
Out[3]: False

In [4]: Path('testdirectory').exists()
Out[4]: True

Ради исто као ос.патх.екистс().

Проверите да ли путања указује на датотеку

In [5]: Path('testfile.txt').is_file()
Out[5]: True

In [6]: Path('testdirectory').is_file()
Out[6]: False

Еквивалентно ос.патх.исфиле().

Проверите да ли путања указује на директоријум

In [7]: Path('testfile.txt').is_dir()
Out[7]: False

In [8]: Path('testdirectory').is_dir()
Out[8]: True

Одговара ос.патх.исдир().

подпроцес

Ако сте љубитељ модула подпроцеса, мораћете да знате о овој опцији. Можете да утврдите да ли датотека или фасцикла постоји помоћу тест команда.

Напомена: Тест команда ради само у Уник-у.

Следеће тестне заставице ће обавити посао:

  • тест -е: Проверите да ли постоји путања
  • тест -ф: Проверите да ли датотека постоји
  • тест-д: Проверите да ли постоји фасцикла

У случају да желите да зароните у више тестних заставица, можете прочитати приручник тако што ћете покренути:

man test

Провера путање са подпроцесом:

Код у наставку одређује да ли путања постоји упоређивањем повратног кода потпроцеса са 0.

Запамтите да ће у Линук-у, ако је процес прошао добро, вратиће нулу, ако није, вратиће било који други код.

In [1]: from subprocess import run

In [2]: run(['test', '-e', 'testfile.txt']).returncode == 0
Out[2]: True

In [3]: run(['test', '-e', 'im-not-here.txt']).returncode == 0
Out[3]: False

У првој изјави увозимо модул подпроцеса, а затим користимо функција покретања и добијање повратног кода.

Провера постојања датотеке са подпроцесом

In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0
Out[4]: True

In [5]: run(['test', '-f', 'testdirectory']).returncode == 0
Out[5]: False

Провера директоријума са подпроцесом:

In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0
Out[6]: False

In [7]: run(['test', '-d', 'testdirectory']).returncode == 0
Out[7]: True

Није препоручљиво да користите ову опцију јер троши више ресурса и од тога немамо никакву предност.

Да сумирам

Питхон је један од најчешће коришћених програмских језика за аутоматизацију процеса интеракцијом са ОС-ом. Једна сјајна ствар коју можете да урадите са њим је да проверите да ли датотека или фасцикла постоји.

Најједноставнији за то су:

  • Отварање и руковање изузецима датотека одмах
  • Коришћење функције екистс() модула ос.патх или патхлиб.

У овом водичу сте научили:

  • Како отворити датотеку и руковати изузецима у случају да не постоји
  • Значење стаза
  • 3 различите функције које подмодул ос.патх пружа за проверу постојања датотеке или фасцикле
  • Уник користи косе црте (/), док Виндовс користи косе црте уназад ()

Следеће читање: Шта је подпроцес у Питхон-у? [5 Usage Examples]