Подписка на блог

Customize in /user/extras/subscribe-sheet.tmpl.php.

Sample text.

Twitter, Facebook, VK icon VK, Telegram, LinkedIn, Odnoklassniki, Pinterest, РСС JSON Feed

Sample text.

9 заметок с тегом

Python

Определяем подкаталоги в текущем каталоге

Обозначим текущий каталог для работы:

path = "./"

Способ 1

Вытаскиваем все файлы из каталога:

import os
os.listdir(path) # не включает специальные записи '.' и '..'

Результат выполнения:

['4.txt',
 'some_module.py',
 '0.txt',
 '.txt',
 '2.txt',
 'Подкаталоги в текущем каталоге.ipynb',
 'командная_оболочка.ipynb',
..

Самый простой способ определить подкаталог:

import os

dir_list = []
for item in os.listdir(path):
    if os.path.isdir(item):
        dir_list.append(item)

dir_list

Результат выполнения:

['__pycache__', 'ipython', '.ipynb_checkpoints']

Способ 2
Для глубокого анализа содержимого каталога лучше использовать функцию scandir, которая возвращает итератор:

dir_list = []

with os.scandir(path) as it: # лучше использовать менеджер контекста, чтобы освободить ресурсы
    for entry in it:
        if entry.is_dir(): # здесь есть нужный нам метод
            dir_list.append(entry.name)

dir_list

Способ 3

Сложность работы с файлами и каталогами состоит в различиях на уровне ОС, поэтому см. модуль pathlib, созданный в ООП-стиле. Он предлагает унифицированный интерфейс для работы с разными ОС:

from pathlib import Path
p = Path(path)
type(p)

Результат выполнения:

pathlib.PosixPath

Модуль работает с типом данных pathlib.PosixPath, но мы ничего не боимся и смело преобразуем все в строку:

[str(x) for x in p.iterdir() if x.is_dir()]

Про pathlib можно подробнее почитать тут.

Способ 4

Двигаемся дальше и воспользуемся возможностями оболочки IPython:

!ls -a ./

Можем получить содержимое каталога и оставить в нем только подкаталоги (про grep писал ранее тут):

file_list = !ls -a ./
file_list.grep(os.path.isdir) # os.path.isfile

Результат выполнения:

['.', '..', '.ipynb_checkpoints', 'ipython', '__pycache__']

см. код в Блокноте Jupyter

 Нет комментариев    33   5 дн   Linux   Python

Получить идентификаторы процессов, принадлежащих пользователю

Вывести информацию о всех выполняющихся процессах можно с помощью UNIX-команды ps aux:

Теперь проведем фильтрацию с помощью Python (мы же питонисты!).

Для начала необходимо понять, каким образом результат командной оболочки ОС преобразуется в типы данных Python:

Получили тип данных (класс), встроенный в IPython.

Внимательно изучаем документацию.

Читаем, что IPython.utils.text.SList наследуется от класса list и является обычным списком с несколькими атрибутами.

Нам может пригодиться метод grep для поиска по шаблону:

и метод fields для выбора определенных столбцов, разделенных пробелом:

Теперь можем перейти к получению PID’ов для заданного пользователя.

Из нулевого столбца выберем все строки, где встречается имя пользователя (0) и оставим столбец (1) с идентификатором процесса:

Более элегантное решение (в gpep для этого указывается аргумент — столбец, по которому производится поиск):

см. код в блокноте Jupyter.

 16   6 дн   Linux   Python

Эволюция командной оболочки Python

Рассмотрим на примере команды ls (просматривает список файлов в директории), как со временем развивалась интерактивная оболочка Python.

Начнем с классической интерактивной оболочки (импортируем модуль os и вызываем метод listdir):

(base) dmf@debian:~/L02-admin$ python3
Python 3.7.3 (default, Mar 27 2019, 22:11:17) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.listdir("./")
['4.txt', 'some_module.py', '0.txt', '.txt', '2.txt', 'командная_оболочка.ipynb', '__pycache__', 'subprocess_ping_function.py', '1.txt', 'Модуль subprocess.ipynb', '3.txt', 'ipython', 'disk_info.py', 'subprocess_run_basic.py', 'введение.ipynb', 'about_ip.ipynb', '.ipynb_checkpoints', 'test_dir.py', 'listdir_script.py']
>>>

Напишем скрипт listdir_script.py:

(base) dmf@debian:~/L02-admin$ cat listdir_script.py 
import os
print(os.listdir("./"))

Покажем, как его выполнить:

(base) dmf@debian:~/L02-admin$ python3 listdir_script.py
['4.txt', 'some_module.py', '0.txt', '.txt', '2.txt', 'командная_оболочка.ipynb', '__pycache__', 'subprocess_ping_function.py', '1.txt', 'Модуль subprocess.ipynb', '3.txt', 'ipython', 'disk_info.py', 'subprocess_run_basic.py', 'введение.ipynb', 'about_ip.ipynb', '.ipynb_checkpoints', 'test_dir.py', 'listdir_script.py']

В конце 2001 года Fernando Pérez под впечатлением от возможностей Mathematica разработал IPython (код первой версии тут, история тут), который поддерживает возможности классического интерпретатора и добавляет несколько magic-команд:

(base) dmf@debian:~/L02-admin$ ipython
Python 3.7.3 (default, Mar 27 2019, 22:11:17) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.16.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import os                                                                                                                         

In [2]: os.listdir("./")                                                                                                                  
Out[2]: 
['4.txt',
 'some_module.py',
 '0.txt',
 '.txt',
 '2.txt',
 ...
 'test_dir.py',
 'listdir_script.py']

Теперь Python-скрипты можно запускать внутри интерактивного сеанса IPython:

In [3]: %run listdir_script.py                                                                                                            
['4.txt', 'some_module.py', '0.txt', '.txt', '2.txt', 'командная_оболочка.ipynb', '__pycache__', 'subprocess_ping_function.py', '1.txt', 'Модуль subprocess.ipynb', '3.txt', 'ipython', 'disk_info.py', 'subprocess_run_basic.py', 'введение.ipynb', 'about_ip.ipynb', '.ipynb_checkpoints', 'test_dir.py', 'listdir_script.py']

Благодаря magic-командам (%) стирается граница между командами операционной системы (ОС) и IPython:

In [4]: %ls                                                                                                                               
0.txt  3.txt	       disk_info.py	  __pycache__		       subprocess_run_basic.py	командная_оболочка.ipynb
1.txt  4.txt	       ipython		  some_module.py	       test_dir.py		Модуль subprocess.ipynb
2.txt  about_ip.ipynb  listdir_script.py  subprocess_ping_function.py  введение.ipynb

Знак % можем не указывать, теперь стало еще сложнее отличить от командной строки ОС:

In [5]: ls ./    # get_ipython().system('ls ./')                                                                                                                             
0.txt  3.txt           disk_info.py       __pycache__/                 subprocess_run_basic.py  командная_оболочка.ipynb
1.txt  4.txt           ipython/           some_module.py               test_dir.py              Модуль subprocess.ipynb
2.txt  about_ip.ipynb  listdir_script.py  subprocess_ping_function.py  введение.ipynb

Добавим немного кода на Python:

In [6]: path = "./"                                                                                                                       

In [7]: ls {path}                                                                                                                       
0.txt  3.txt	       disk_info.py	  __pycache__		       subprocess_run_basic.py	командная_оболочка.ipynb
1.txt  4.txt	       ipython		  some_module.py	       test_dir.py		Модуль subprocess.ipynb
2.txt  about_ip.ipynb  listdir_script.py  subprocess_ping_function.py  введение.ipynb

In [8]: ls $path                                                                                                                        
0.txt  3.txt	       disk_info.py	  __pycache__		       subprocess_run_basic.py	командная_оболочка.ipynb
1.txt  4.txt	       ipython		  some_module.py	       test_dir.py		Модуль subprocess.ipynb
2.txt  about_ip.ipynb  listdir_script.py  subprocess_ping_function.py  введение.ipynb

Следующий шаг в эволюции — браузерная среда разработки Jupyter Lab, которая объединяет оболочку IPython c возможностью написания произвольных комментариев (расширяется с помощью плагинов).

Выполнение скриптов:

Интеграция кода на Python и команд ОС:

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

Медленно, но верно я перевожу все свои курсы по программированию и анализу данных на Jupyter Lab. Вместо сотни отдельных файлов *.py получилась парочка блокнотов *.ipynb.

 18   6 дн   Linux   Python
Ранее Ctrl + ↓