Как узнать размер файла python

Обновлено: 04.07.2024

Я пишу Python script в Windows. Я хочу сделать что-то на основе размера файла. Например, если размер больше 0, я пришлю электронное письмо кому-либо, в противном случае продолжаю другие вещи.

Как проверить размер файла?

Используйте os.stat и используйте элемент st_size результирующего объекта:

Вывод находится в байтах.

Во всяком случае, значение может быть передано в виде кратных размеру блока файловой системы (например, 4096 байт). К счастью, оно дается в байтах. @josch - да, это хорошо, для "размера на диске" вы можете умножить stat_result.st_blocks на размер блока, но я все еще ищу, как получить его программно и кроссплатформенно (не через tune2fs и т. д.)

Вывод находится в байтах.

Примечание: реализация os.path.getsize просто return os.stat(filename).st_size Таким образом, существует ли незначительная потеря производительности при использовании os.path.getsize, а не os.stat (file) .st_size?

150 нс в моем компьютере.

@wordsforthewise Так это как 2071611L байтов или 2071611L МБ? Что означает L? Пожалуйста скажите, что я новичок в Файла Сколько L 8MB? Google говорит, что 8e+6 я могу просто сравнить с 8e?

Другие ответы работают на реальные файлы, но если вам нужно что-то, что работает для "файловых объектов", попробуйте следующее:

Он работает для реальных файлов и StringIO, в моем ограниченном тестировании. (Python 2.7.3.) API-интерфейс "file-like object", конечно, не является строгим интерфейсом, но API-документация предлагает что файловые объекты должны поддерживать seek() и tell() .

Edit

Другое отличие между этим и os.stat() заключается в том, что вы можете stat() файл, даже если у вас нет разрешения на его чтение. Очевидно, что подход seek/tell не будет работать, если у вас нет разрешения на чтение.

Изменить 2

В предположении Джонатона, здесь параноидальная версия. (Версия выше оставляет указатель файла в конце файла, поэтому, если вы попытаетесь прочитать из файла, вы получите нулевые байты!)


Эта статья — часть цик­ла «Python с абсо­лют­ного нуля», где мы рас­ска­зыва­ем об азах Python в нашем фир­менном нес­кучном сти­ле. Ты можешь читать их по поряд­ку или выбирать какие‑то области, которые хотел бы под­тянуть.

  • Урок 1: Пе­ремен­ные, типы дан­ных, усло­вия и цик­лы
  • Урок 2: Стро­ки, фай­лы, исклю­чения и работа с интерне­том

Пер­вые два уро­ка дос­тупны целиком без плат­ной под­писки. Этот — поч­ти целиком: за исклю­чени­ем пос­ледне­го при­мера и домаш­него задания.

Работаем с файлами

Нач­нем, как всег­да, с нес­ложных вещей. В Python есть модуль с лаконич­ным наз­вани­ем os , который (ты не поверишь!) пред­назна­чен для вза­имо­дей­ствия прог­раммы с опе­раци­онной сис­темой, в том чис­ле для управле­ния фай­лами.

Пер­вым делом, конеч­но, нуж­но импорти­ровать его в начале нашего скрип­та:

И теперь нам откры­вают­ся раз­ные инте­рес­ные воз­можнос­ти. К при­меру, мы можем получить путь к текущей пап­ке. Сна­чала она сов­пада­ет с той, в которой ты был при запус­ке скрип­та (даже если сам скрипт находит­ся где‑то в дру­гом мес­те), но по ходу исполне­ния прог­раммы мы можем менять это зна­чение при помощи фун­кции os. chdir( ) .

Ес­ли ты работа­ешь в Windows, то в пути к фай­лу или пап­ке перед откры­вающей кавыч­кой ука­зывай бук­ву r (что озна­чает raw) или вмес­то одной косой чер­ты в пути ставь две.

Поп­робу­ем получить спи­сок фай­лов с рас­ширени­ем .py, находя­щих­ся в текущей дирек­тории. Для это­го исполь­зуем модули os и fnmatch.

Мо­дуль fnmatch поз­воля­ет искать в стро­ках опре­делен­ный текст, под­ходящий по мас­ке к задан­ному шаб­лону:

  • * заменя­ет любое количес­тво любых сим­волов;
  • ? заменя­ет один любой сим­вол;
  • [ seq] заменя­ет любые сим­волы из пос­ледова­тель­нос­ти в квад­ратных скоб­ках;
  • [! seq] заменя­ет любые сим­волы, кро­ме тех, что при­сутс­тву­ют в квад­ратных скоб­ках.

Да­вай без­жалос­тно уда­лим какой‑нибудь файл:

А теперь соз­дадим пап­ку по ука­зан­ному пути и сра­зу же уда­лим ее. Для это­го при­годит­ся модуль shutil, где есть фун­кция rmtree( ) , которая уда­ляет пап­ку вмес­те с содер­жимым.

До­пус­тим, ты хочешь получить спи­сок всех фай­лов, содер­жащих­ся в пап­ках по ука­зан­ному пути (учи­тывая вло­жен­ные пап­ки тоже), что­бы най­ти что‑то инте­рес­ное. Скрипт будет выг­лядеть сле­дующим обра­зом:

warning

Будь осто­рожен — скрипт в таком виде обша­рит весь диск D. Если он у тебя есть и там мно­го хла­ма, то про­цесс может затянуть­ся.

Фун­кция walk() модуля os при­нима­ет один обя­затель­ный аргу­мент — имя катало­га. Она пос­ледова­тель­но про­ходит все вло­жен­ные катало­ги и воз­вра­щает объ­ект‑генера­тор, из которо­го получа­ют:

  • ад­рес оче­ред­ного катало­га в виде стро­ки;
  • спи­сок имен под­катало­гов пер­вого уров­ня вло­жен­ности для дан­ного катало­га;
  • спи­сок имен фай­лов дан­ного катало­га.

Ге­нера­тор — это объ­ект, который сра­зу при соз­дании не вычис­ляет зна­чения всех сво­их эле­мен­тов. Этим генера­торы отли­чают­ся от спис­ков — те хра­нят в памяти все свои эле­мен­ты, и уда­лить их мож­но толь­ко прог­рам­мно. Вычис­ления с помощью генера­торов называ­ются ленивы­ми, они эко­номят память. Под­робнее мы рас­смот­рим генера­торы в сле­дующих уро­ках.

Сей­час покажу, как узнать раз­мер любого фай­ла, а так­же дату его модифи­кации.

print ( 'Дата последнего использования: ' , datetime . fromtimestamp ( atime ) ) print ( 'Дата последнего редактирования: ' , datetime . fromtimestamp ( mtime ) )

Для опе­раци­онных сис­тем Unix 1 янва­ря 1970, 00:00:00 (UTC) — точ­ка отсче­та вре­мени, или «начало эпо­хи». Чаще все­го вре­мя в компь­юте­ре вычис­ляет­ся в виде про­шед­ших с это­го момен­та секунд и лишь затем перево­дит­ся в удоб­ный для челове­ка вид.

Да­вай пошутим над юзе­ром: соз­дадим какой‑нибудь файл и будем пос­тоян­но его откры­вать с помощью той прог­раммы, которой этот файл обыч­но откры­вает­ся в сис­теме:

f . write ( 'СРОЧНО НАЛЕЙТЕ ХАКЕРУ ПИВА, ИНАЧЕ ЭТО НЕ ЗАКОНЧИТСЯ!!' )

Ни­же при­веден спи­сок еще некото­рых полез­ных команд:

  • os. path. basename( 'путь') — воз­вра­щает наз­вание фай­ла или пап­ки в кон­це пути;
  • os. path. dirname( 'путь') — воз­вра­щает родитель­ский путь к объ­екту пути;
  • os. path. splitext( 'путь') — раз­деля­ет путь на путь и рас­ширение фай­ла;
  • os. path. exists( 'путь') — сущес­тву­ет ли путь до фай­ла или пап­ки;
  • os. path. isfile( 'путь') — явля­ется ли объ­ект пути фай­лом (сущес­тву­ющим);
  • os. path. isdir( 'путь') — явля­ется ли объ­ект пути пап­кой (сущес­тву­ющей).

Регулярные выражения

Ре­гуляр­ные выраже­ния — это спе­циаль­ные шаб­лоны для поис­ка и замены строк в тек­сте. Вооб­ще говоря, их впол­не мож­но счи­тать самос­тоятель­ным язы­ком, и его изу­чение выходит за рам­ки это­го цик­ла. Мы прой­дем­ся по самым осно­вам и по исполь­зованию регуля­рок в Python.

Под­робнее о регэк­спах ты можешь почитать в до­кумен­тации Python, в Ви­кипе­дии или в кни­ге Джеф­фри Фрид­ла, которая так и называ­ется — «Ре­гуляр­ные выраже­ния».

За работу с регуляр­ными выраже­ниями в Python отве­чает модуль re. Пер­вым делом импорти­руем его.

В качес­тве прос­тей­шего пат­терна мы можем исполь­зовать какое‑нибудь сло­во. Пусть по тра­диции это будет «пиво»:

string = "Хакер знает, что пиво играет во взломе решающую роль. Свежее пиво — ключ к сисадмину. Пока сисадмин ходит писать, можно сесть за его комп и внедрить троян. "

Ко­ман­да re. search( pattern, string) ищет в тек­сте string пер­вое вхож­дение шаб­лона pattern и воз­вра­щает груп­пу строк, дос­туп к которым мож­но получить через метод . group( ) . Но коман­да search ищет толь­ко пер­вое вхож­дение шаб­лона. Поэто­му в нашем слу­чае вер­нется все­го один резуль­тат — сло­во «пиво», нес­мотря на то что в нашем тек­сте оно при­сутс­тву­ет дваж­ды.

Что­бы вер­нуть все вхож­дения шаб­лона в текст, исполь­зует­ся коман­да re. findall( pattern, string) . Эта коман­да вер­нет спи­сок строк, которые при­сутс­тву­ют в тек­сте и сов­пада­ют с шаб­лоном.

string = "Хакер знает, что пиво играет во взломе решающую роль. Свежее пиво — ключ к сисадмину. Пока сисадмин ходит писать, можно сесть за его комп и внедрить троян. "

Об­рати вни­мание, что шаб­лоны в регуляр­ных выраже­ниях име­ют буков­ку r перед началом стро­ки. Это так называ­емые сырые стро­ки, в которых не работа­ет сим­вол экра­ниро­вания с помощью обратно­го сле­ша \ . При этом «сырая» стро­ка не может закан­чивать­ся этим сим­волом.

В пре­дыду­щих двух при­мерах прог­рамм в качес­тве шаб­лона pattern для поис­ка строк ты исполь­зовал прос­то какое‑то сло­во. Но мощь регуляр­ных выраже­ний не в этом. Ты можешь заменять час­ти шаб­лона спе­циаль­ными сим­волами, что­бы под шаб­лон под­ходили не толь­ко кон­крет­ные сло­ва, но и самые раз­ные стро­ки.

Да­вай, нап­ример, поп­робу­ем най­ти в тек­сте все сло­ва, которые начина­ются с «пи». Для это­го исполь­зуем спе­циаль­ный сим­вол \ b — он озна­чает «начало сло­ва». Сра­зу пос­ле него ука­зыва­ем, с чего дол­жно начинать­ся сло­во, и напишем спе­циаль­ный сим­вол w , который озна­чает, что даль­ше в шаб­лоне дол­жны идти какие‑то бук­вы (плюс озна­чает, что их может быть одна или боль­ше) до тех пор, пока не встре­тит­ся небук­венный сим­вол (нап­ример, про­бел или знак пре­пина­ния). Шаб­лон будет выг­лядеть так: r"\ bпи\ w+" .

string = "Хакер знает, что пиво играет во взломе решающую роль. Свежее пиво — ключ к сисадмину. Пока сисадмин ходит писать, можно сесть за его комп и внедрить троян. "

Краткая справка по специальным символам

Крат­кая справ­ка по спе­циаль­ным сим­волам

Да­вай поп­робу­ем выпол­нить чуть более слож­ную задачу. Най­дем в тек­сте все email с доменом mail. ru , если они там есть.

string = "Если вы хотите связаться с админом, пишите на почту admin@mail. ru. По другим вопросам обращайтесь на support@mail. ru. "

Как видишь, мы исполь­зовали тот же трюк, что и в прош­лый раз, — написа­ли спе­циаль­ный сим­вол \ b , что­бы обоз­начить начало сло­ва, потом \ w+ , что зна­чит «одна или боль­ше букв», а затем @mail. ru , заэк­раниро­вав точ­ку, пос­коль­ку ина­че она будет озна­чать «любой сим­вол».

Час­то быва­ет нуж­но най­ти какой‑то эле­мент стро­ки, окру­жен­ный дву­мя дру­гими эле­мен­тами. Нап­ример, это может быть URL. Что­бы выделить ту часть шаб­лона, которую нуж­но вер­нуть, исполь­зуют­ся скоб­ки. При­веду при­мер, в котором ты получишь все адре­са ссы­лок из какого‑то кусоч­ка кода на HTML.

string = 'Вы можете посмотреть карту сайта < a href s">php"> тут</ a>. Посетите также < a href s">php"раздел</ a> '

В коде выше исполь­зовал­ся пат­терн r'href — в этом шаб­лоне иско­мая стро­ка начина­ется с href code47">result . Точ­ка и плюс внут­ри ско­бок ука­зыва­ют, что внут­ри кавычек могут быть любые сим­волы (кро­ме сим­вола новой стро­ки). Знак воп­роса озна­чает, что нуж­но оста­новить­ся перед пер­вой же встре­чен­ной кавыч­кой.

Знак воп­роса в регуляр­ных выраже­ниях исполь­зует­ся в двух нем­ного раз­ных смыс­лах. Если он идет пос­ле одно­го сим­вола, это зна­чит, что сим­вол может при­сутс­тво­вать или не при­сутс­тво­вать в стро­ке. Если же воп­роситель­ный знак идет пос­ле груп­пы сим­волов, это озна­чает «нежад­ный» (non-greedy) режим: такая регуляр­ка будет ста­рать­ся зах­ватить как мож­но мень­ше сим­волов.

Мы можем не толь­ко искать стро­ки, но и заменять их чем‑то дру­гим. Нап­ример, давай поп­робу­ем уда­лить из HTML-кода все теги. Для это­го исполь­зует­ся коман­да re. sub( pattern, 'чем заменять', string) .

string = 'Вы можете посмотреть карту сайта < a href s">php"> тут</ a>. Посетите также < a href s">php"раздел</ a> '

Прог­рамма напеча­тает стро­ку уже без тегов, так как мы замени­ли их пус­той стро­кой.

Ре­гуляр­ные выраже­ния — очень мощ­ная шту­ка. Осво­ив их, ты смо­жешь делать со стро­ками поч­ти все, что угод­но, а в сочета­нии с кодом на Python — бук­валь­но что угод­но. Для начала же можешь поэк­спе­римен­тировать и изме­нить какие‑то из при­веден­ных рецеп­тов.

Функции

Приш­ла пора под­робнее погово­рить о фун­кци­ях. Мы уже неод­нократ­но вызыва­ли раз­ные фун­кции — как встро­енные в Python (нап­ример, print( ) ), так и из под­клю­чаемых модулей (нап­ример, urllib. request( ) ). Но что такое фун­кция изнутри и как их делать самос­тоятель­но?

Пред­ставь, что у тебя есть какой‑то набор команд, которые нуж­но выпол­нять нес­коль­ко раз, изме­няя лишь вход­ные дан­ные. Такие бло­ки команд обыч­но выносят в отдель­ные кусоч­ки прог­раммы.

В объ­ектно ори­енти­рован­ном прог­рамми­рова­нии фун­кции явля­ются метода­ми какого‑либо клас­са и пишут­ся через точ­ку от его наз­вания.

У фун­кции могут быть вход­ные парамет­ры — это одна или нес­коль­ко перемен­ных, которые пишут­ся в скоб­ках пос­ле име­ни фун­кции. При вызове фун­кции ты можешь передать ей аргу­мен­ты для этих парамет­ров. Некото­рые из парамет­ров могут быть необя­затель­ными или иметь зна­чение по умол­чанию — на слу­чай, если его не переда­дут.

Объ­явле­ние фун­кции начина­ется с клю­чево­го сло­ва def , далее сле­дует имя фун­кции, парамет­ры в скоб­ках и прог­рам­мный код, отде­лен­ный четырь­мя про­бела­ми. Фун­кция может воз­вра­щать одно или нес­коль­ко зна­чений с помощью клю­чево­го сло­ва return . Оно, кста­ти, прек­раща­ет работу фун­кции, и, если за ним идут какие‑то коман­ды, они будут про­пуще­ны.

Для при­мера раз­берем прос­тей­шую фун­кцию, которая будет при­нимать в качес­тве аргу­мен­тов два любых чис­ла и перем­ножать их, воз­вра­щая резуль­тат умно­жения. Назовем ее umn.

Те­перь, ког­да ты опи­сал фун­кцию, далее в этой же прог­рамме мож­но ее вызывать.

Иног­да надо задать один из парамет­ров как необя­затель­ный, уста­новив для него зна­чение по умол­чанию.

Те­перь если ты вызовешь фун­кцию и не передашь ей вто­рой аргу­мент, то она прос­то будет счи­тать его рав­ным десяти, то есть будет умно­жать любое передан­ное чис­ло на десять.

Нес­мотря на то что параметр b в дан­ном слу­чае равен по умол­чанию 10 и необя­зате­лен для переда­чи в качес­тве вто­рого аргу­мен­та, ты по‑преж­нему можешь переда­вать вто­рой аргу­мент, если это будет нуж­но, и тог­да в качес­тве b будет исполь­зовано не 10 , а передан­ное зна­чение.

Внут­ри прог­раммы мы можем вызывать соз­данную нами фун­кцию сколь­ко угод­но раз.

Да­вай соз­дадим прог­рамму, которая будет счи­тать при­бав­ку к зар­пла­те за каж­дую уяз­вимость, которую хакер нашел на работе. У каж­дого хакера будет своя зар­пла­та, в зависи­мос­ти от его ран­га, но начис­ление при­бав­ки для всех работа­ет по прин­ципу «+2% к базовой зар­пла­те за уяз­вимость, если таких уяз­вимос­тей най­дено боль­ше чем три».

Сде­лаем фун­кцию, которая при­нима­ет в качес­тве аргу­мен­тов раз­мер зар­пла­ты сот­рудни­ка и количес­тво най­ден­ных уяз­вимос­тей. Для округле­ния резуль­тата исполь­зуем фун­кцию round( ) , которая округлит при­бав­ку до целого чис­ла.

Функция getsize() модуля os.path возвращает размер файла в байтах, указанного в path . Если path не существует или недоступен, то поднимается исключение OSError .

Аргумент path может принимать байтовые или текстовые строки. Функция os.path.getsize() может принимать объект, представляющий путь к файловой системе, например такой как pathlib.PurePath .

Примеры использования:

Другие ответы работают на реальные файлы, но если вам нужно что-то, что работает для "файловых объектов", попробуйте следующее:

Он работает для реальных файлов и StringIO, в моем ограниченном тестировании. (Python 2.7.3.) API-интерфейс "file-like object", конечно, не является строгим интерфейсом, но API-документация предлагает что файловые объекты должны поддерживать seek() и tell() .

Edit

Другое отличие между этим и os.stat() заключается в том, что вы можете stat() файл, даже если у вас нет разрешения на его чтение. Очевидно, что подход seek/tell не будет работать, если у вас нет разрешения на чтение.

Изменить 2

В предположении Джонатона, здесь параноидальная версия. (Версия выше оставляет указатель файла в конце файла, поэтому, если вы попытаетесь прочитать из файла, вы получите нулевые байты!)

Как проверить размер файла в python? (python)

Другие ответы работают на реальные файлы, но если вам нужно что-то, что работает для "файловых объектов", попробуйте следующее:

Он работает для реальных файлов и StringIO, в моем ограниченном тестировании. (Python 2.7.3.) API-интерфейс "file-like object", конечно, не является строгим интерфейсом, но API-документация предлагает что файловые объекты должны поддерживать seek() и tell() .

Edit

Другое отличие между этим и os.stat() заключается в том, что вы можете stat() файл, даже если у вас нет разрешения на его чтение. Очевидно, что подход seek/tell не будет работать, если у вас нет разрешения на чтение.

Изменить 2

В предположении Джонатона, здесь параноидальная версия. (Версия выше оставляет указатель файла в конце файла, поэтому, если вы попытаетесь прочитать из файла, вы получите нулевые байты!)

Получить размер файла перед загрузкой в Python

я воспроизвел то, что вы видите:

что я здесь делаю не так? Это ОС.stat ().st_size не возвращает правильный размер?

изменить: Хорошо, я понял, в чем проблема:

убедитесь, что вы открываете оба файла для бинарного чтения/записи.

автор: Jonathan Works

Вычисление размера каталога с помощью Python?

следующий скрипт печатает размер каталога всех подкаталогов для указанного каталога. Он также пытается извлечь выгоду (если это возможно) из кэширования вызовов рекурсивных функций. Если аргумент опущен, скрипт будет работать в текущем каталоге. Выходные данные сортируются по размеру каталога от самых больших до самых маленьких. Так вы можете приспособить его для ваших потребностей.

EDIT: перемещен null_decorator выше, как рекомендовал user2233949

Как проверить размер файла в Python?

Другие ответы работают для реальных файлов, но если вам нужно что-то, что работает для «файловых объектов», попробуйте это:

Это работает для реальных файлов и StringIO, в моем ограниченном тестировании. (Python 2.7.3.) API "file-like object", конечно, не совсем строгий интерфейс, но документация API предполагает, что file-like объекты должны поддерживать seek() и tell() .

редактировать

Редактировать 2

По предложению Джонатона, вот параноидальная версия. (Приведенная выше версия оставляет указатель файла в конце файла, поэтому, если вы попытаетесь прочитать файл, вы получите ноль байтов назад!)

Автор: Mark E. Haase Размещён: 29.09.2013 03:41

Получить размер файла в python тремя способами

Существуют разные методы получения размера файла в python, и в этой статье объясняются 3 из этих методов с примерами.
Определение размера файла становится важным, когда вы хотите отслеживать определенный файл на предмет ограничения размера или когда вы хотите упорядочить файлы в каталоге на основе их размера.

Метод 1. Использование модуля os.path
Модуль Python os.path предоставляет функцию getsize , которая принимает путь к файлу в качестве аргумента и возвращает размер файла в байтах.
Пример,

Приведенный выше код дает следующий результат

Размер файла 760 байт

Метод 2: Использование функции stat
Модуль os Python предоставляет stat , которая принимает путь в качестве аргумента. Этот путь может быть строкой или объектом пути и возвращает структуру, содержащую статистические данные о предоставленном пути.

Эта структура имеет множество свойств, из которых свойство st_size содержит размер файла (в байтах), присутствующего по указанному пути.
Пример,

Вывод этого кода следующий

Размер файла 760 байт

Если вы распечатываете значение, возвращаемое функцией os.stats , тогда вы получите что-то вроде этого.
os.stat_result (st_mode = 33206, st_ino = 562949953421562, st_dev = 101961010, st_nlink = 1, st_uid = 0, st_gid = 0, st_size = 760, st_atime = 1554137744, st_mtime = 9353000, st_mtime = 9353000 = 15541377) Notice = 9351377 он имеет свойство st_size .

Метод 3: Использование файлового объекта
Откройте файл, размер которого необходимо определить с помощью функции open , и назначьте возвращаемый объект переменной. Возвращенный объект действует как дескриптор файла и может использоваться для различных операций обработки файлов.

Узнайте, как читать файл на Python , здесь .

Как только мы получим объект, указывающий на файл, необходимо предпринять следующие шаги, чтобы узнать размер файла с помощью этого метода.

  1. Первоначально, когда файл открыт, курсор файла указывает на начало файла. Файловый объект имеет метод seek , который используется для установки курсора в желаемое место.
    Он принимает 2 аргумента: первый - это начальное положение, а второй - конечное положение, в которое будет помещен курсор.
    Если первый аргумент не указан, то по умолчанию он равен 0, что означает начало файла.
  2. Установите курсор в конец файла, используя метод seek , задав ему 0 в качестве начального значения и os.SEEK_END в качестве конечного значения, где SEEK_END - это константа, это модуль os и отмечает конец файл.
  3. Файловый объект имеет метод tell , который возвращает текущую позицию курсора. Это количество байтов, на которое переместился курсор.
  4. Таким образом, когда вы помещаете файловый курсор в конец файла, метод tell фактически вернет количество байтов в файле, которое также является размером файла.

Пример,

Вывод этого кода

Размер файла 760 байтов

Надеюсь, этот пост поможет вам в вычислении размера файла с использованием Python.


Python становится все популярнее благодаря относительной простоте изучения, универсальности и другим преимуществам. Правда, у начинающих разработчиков нередко возникают проблемы при работе с файлами и файловой системой. Просто потому, что они знают не все команды, которые нужно знать.

Эта статья предназначена как раз для начинающих разработчиков. В ней описаны 8 крайне важных команд для работы с файлами, папками и файловой системой в целом. Все примеры из этой статьи размещены в Google Colab Notebook (ссылка на ресурс — в конце статьи).

Показать текущий каталог

Самая простая и вместе с тем одна из самых важных команд для Python-разработчика. Она нужна потому, что чаще всего разработчики имеют дело с относительными путями. Но в некоторых случаях важно знать, где мы находимся.

Относительный путь хорош тем, что работает для всех пользователей, с любыми системами, количеством дисков и так далее.

Так вот, для того чтобы показать текущий каталог, нужна встроенная в Python OS-библиотека:


Ее легко запомнить, так что лучше выучить один раз, чем постоянно гуглить. Это здорово экономит время.


Имейте в виду, что я использую Google Colab, так что путь /content является абсолютным.

Проверяем, существует файл или каталог

Прежде чем задействовать команду по созданию файла или каталога, стоит убедиться, что аналогичных элементов нет. Это поможет избежать ряда ошибок при работе приложения, включая перезапись существующих элементов с данными.

Функция os.path.exists () принимает аргумент строкового типа, который может быть либо именем каталога, либо файлом.

В случае с Google Colab при каждом запуске создается папка sample_data. Давайте проверим, существует ли такой каталог. Для этого подойдет следующий код:


Эта же команда подходит и для работы с файлами:


Если папки или файла нет, команда возвращает false.


Объединение компонентов пути

В предыдущем примере я намеренно использовал слеш "/" для разделителя компонентов пути. В принципе это нормально, но не рекомендуется. Если вы хотите, чтобы ваше приложение было кроссплатформенным, такой вариант не подходит. Так, некоторые старые версии ОС Windows распознают только слеш "\" в качестве разделителя.

Но не переживайте, Python прекрасно решает эту проблему благодаря функции os.path.join (). Давайте перепишем вариант из примера в предыдущем пункте, используя эту функцию:




Создание директории

Ну а теперь самое время создать директорию с именем test_dir внутри рабочей директории. Для этого можно использовать функцию
os.mkdir():


Давайте посмотрим, как это работает на практике.


Если же мы попытаемся создать каталог, который уже существует, то получим исключение.


Именно поэтому рекомендуется всегда проверять наличие каталога с определенным названием перед созданием нового:


Еще один совет по созданию каталогов. Иногда нам нужно создать подкаталоги с уровнем вложенности 2 или более. Если мы все еще используем os.mkdir (), нам нужно будет сделать это несколько раз. В этом случае мы можем использовать os.makedirs (). Эта функция создаст все промежуточные каталоги так же, как флаг mkdir -p в системе Linux:


Вот что получается в результате.


Показываем содержимое директории

Еще одна полезная команда — os.listdir(). Она показывает все содержимое каталога.

Команда отличается от os.walk (), где последний рекурсивно показывает все, что находится «под» каталогом. os.listdir () намного проще в использовании, потому что просто возвращает список содержимого:


В некоторых случаях нужно что-то более продвинутое — например, поиск всех CSV-файлов в каталоге «sample_data». В этом случае самый простой способ — использовать встроенную библиотеку glob:


Перемещение файлов

Самое время попробовать переместить файлы из одной папки в другую. Рекомендованный способ — еще одна встроенная библиотека shutil.
Сейчас попробуем переместить все CSV-файлы из директории «sample_data» в директорию «test_dir». Ниже — пример кода для выполнения этой операции:


Кстати, есть два способа выполнить задуманное. Например, мы можем использовать библиотеку OS, если не хочется импортировать дополнительные библиотеки. Как os.rename, так и os.replace подходят для решения задачи.

Но обе они недостаточно «умные», чтобы позволить перемесить файлы в каталог.


Чтобы все это работало, нужно явно указать имя файла в месте назначения. Ниже — код, который это позволяет сделать:


Здесь функция os.path.basename () предназначена для извлечения имени файла из пути с любым количеством компонентов.

Другая функция, os.replace (), делает то же самое. Но разница в том, что os.replace () не зависит от платформы, тогда как os.rename () будет работать только в системе Unix / Linux.

Еще один минус — в том, что обе функции не поддерживают перемещение файлов из разных файловых систем, в отличие от shutil.

Поэтому я рекомендую использовать shutil.move () для перемещения файлов.

Копирование файлов

Аналогичным образом shutil подходит и для копирования файлов по уже упомянутым причинам.

Если нужно скопировать файл README.md из папки «sample_data» в папку «test_dir», поможет функция shutil.copy():



Удаление файлов и папок

Теперь пришел черед разобраться с процедурой удаления файлов и папок. Нам здесь снова поможет библиотека OS.

Когда нужно удалить файл, нужно воспользоваться командой os.remove():


Если требуется удалить каталог, на помощь приходит os.rmdir():


Однако он может удалить только пустой каталог. На приведенном выше скриншоте видим, что удалить можно лишь каталог level_3. Что если мы хотим рекурсивно удалить каталог level_1? В этом случае зовем на помощь shutil.


Функция shutil.rmtree() сделает все, что нужно:


Пользоваться ею нужно с осторожностью, поскольку она безвозвратно удаляет все содержимое каталога.

Собственно, на этом все. 8 важных операций по работе с файлами и каталогами в среде Python мы знаем. Что касается ссылки, о которой говорилось в анонсе, то вот она — это Google Colab Network с содержимым, готовым к запуску.

Читайте также: