Введение в модуль ОС Python

В этом руководстве вы узнаете, как работать вместе с модулем ОС Python. Содержание 1. Введение 2. Основные функции 3. Список файлов / папок в текущем рабочем каталоге 4. Изменение рабочего каталога 5. Создание структуры одиночного и вложенного каталога 6. Рекурсивное удаление структуры одиночного и вложенного каталога 7. Пример обработки данных 8. Заключение Введение Python - один из наиболее часто используемых языков в последнее время для различных задач, таких как обработка данных, d

В этом руководстве вы узнаете, как работать вместе с модулем os

Оглавление

  1. Вступление
  2. Основные функции
  3. Список файлов / папок в текущем рабочем каталоге
  4. Изменить рабочий каталог
  5. Создание единой и вложенной структуры каталогов
  6. Рекурсивное удаление одиночной и вложенной структуры каталогов
  7. Пример с обработкой данных
  8. Заключение

Вступление

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

Некоторые основные функции

Давайте исследуем модуль на примере кода.

Импортируйте библиотеку:

 import os 

Получим список методов, которые мы можем использовать с этим модулем.

 print(dir(os)) 

Выход:

 ['DirEntry', 'F_OK', 'MutableMapping', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'PathLike', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_execvpe', '_exists', '_exit', '_fspath', '_get_exports_list', '_putenv', '_unsetenv', '_wrap_close', 'abc', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fdopen', 'fsdecode', 'fsencode', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_exec_path', 'get_handle_inheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getenv', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'name', 'open', 'pardir', 'path', 'pathsep', 'pipe', 'popen', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sep', 'set_handle_inheritable', 'set_inheritable', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'st', 'startfile', 'stat', 'stat_float_times', 'stat_result', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sys', 'system', 'terminal_size', 'times', 'times_result', 'truncate', 'umask', 'uname_result', 'unlink', 'urandom', 'utime', 'waitpid', 'walk', 'write'] 

Теперь, используя getcwd , мы можем получить путь к текущему рабочему каталогу.

 print(os.getcwd()) 

Выход:

 C:\Users\hpandya\OneDrive\work\StackAbuse\os_python\os_python\Project 

Список папок и файлов

listdir список папок / файлов в текущем каталоге с помощью listdir:

 print(os.listdir()) 

Выход:

 ['Data', 'Population_Data', 'README.md', 'tutorial.py', 'tutorial_v2.py'] 

Как видите, у меня есть 2 папки: Data и Population_Data . У меня также есть 3 файла: README.md и два файла Python, а именно tutorial.py и tutorial_v2.py .

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

 # function to list files in each folder of the current working directory 
 
 def list_files(startpath): 
 for root, dirs, files in os.walk(startpath): 
 # print(dirs) 
 if dir!= '.git': 
 level = root.replace(startpath, '').count(os.sep) 
 indent = ' ' * 4 * (level) 
 print('{}{}/'.format(indent, os.path.basename(root))) 
 subindent = ' ' * 4 * (level + 1) 
 for f in files: 
 print('{}{}'.format(subindent, f)) 

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

 startpath = os.getcwd() 
 list_files(startpath) 

Выход:

 Project/ 
 README.md 
 tutorial.py 
 tutorial_v2.py 
 Data/ 
 uscitiesv1.4.csv 
 Population_Data/ 
 Alabama/ 
 Alabama_population.csv 
 Alaska/ 
 Alaska_population.csv 
 Arizona/ 
 Arizona_population.csv 
 Arkansas/ 
 Arkansas_population.csv 
 California/ 
 California_population.csv 
 Colorado/ 
 Colorado_population.csv 
 Connecticut/ 
 Connecticut_population.csv 
 Delaware/ 
 Delaware_population.csv 
 ... 

[Примечание. Вывод был усечен для краткости.]{.small}

Как видно из вывода, имена папок заканчиваются символом / а файлы в папках имеют отступ на четыре пробела вправо. В Data есть один CSV-файл с именем uscitiesv1.4.csv . В этом файле содержатся данные о населении каждого города США. В папке Population_Data есть папки для состояний, содержащие отдельные файлы csv для данных о населении для каждого штата, извлеченные из uscitiesv1.4.csv .

Изменить рабочий каталог

Сменим рабочий каталог и войдем в каталог данных со штатом «Нью-Йорк».

 os.chdir('Population_Data/New York') 

Теперь давайте снова list_files метод list_files, но уже в этом каталоге.

 list_files(os.getcwd()) 

Выход:

 New York/ 
 New York_population.csv 

Как видите, мы вошли в папку New York Population_Data .

Создание единой и вложенной структуры каталогов

testdir в этом каталоге новый каталог с именем testdir.

 os.mkdir('testdir') 

 list_files(os.getcwd()) 

Выход:

 New York/ 
 New York_population.csv 
 testdir/ 

Как видите, он создает новый каталог в текущем рабочем каталоге.

Создадим вложенный каталог с 2 уровнями.

 os.mkdir('level1dir/level2dir') 

Выход:

 Traceback (most recent call last): 
 
 File "<ipython-input-12-ac5055572301>", line 1, in <module> 
 os.mkdir('level1dir/level2dir') 
 
 FileNotFoundError: [WinError 3] The system cannot find the path specified: 'level1dir/level2dir' 

Получаем ошибку. Чтобы быть конкретным, мы получаем FileNotFoundError . Вы можете спросить, почему возникает FileNotFound когда мы пытаемся создать каталог.

Причина: модуль Python ищет каталог с именем level1dir для создания каталога level2dir . Поскольку level1dir не существует, в первую очередь он выдает FileNotFoundError .

Для подобных целей mkdirs() , которая может рекурсивно создавать несколько каталогов.

 os.makedirs('level1dir/level2dir') 

Проверить текущее дерево каталогов,

 list_files(os.getcwd()) 

Выход:

 New York/ 
 New York_population.csv 
 level1dir/ 
 level2dir/ 
 testdir/ 

Как мы видим, теперь у нас есть два подкаталога в папке New York testdir и level1dir . level1dir есть каталог под названием level2dir .

Рекурсивное удаление одного и нескольких каталогов

В os также есть методы для изменения или удаления каталогов, которые я покажу здесь.

Теперь давайте удалим каталоги, которые мы только что создали с помощью rmdir :

 os.rmdir('testdir') 

Проверьте текущее дерево каталогов, чтобы убедиться, что каталог больше не существует:

 list_files(os.getcwd()) 

Выход:

 New York/ 
 New York_population.csv 
 level1dir/ 
 level2dir/ 

Как видите, testdir удален.

Давайте попробуем удалить структуру вложенных каталогов level1dir и level2dir .

 os.rmdir('level1dir') 

Выход:

 OSError 
 Traceback (most recent call last) 
 <ipython-input-14-690e535bcf2c> in <module>() 
 ----> 1 os.rmdir('level1dir') 
 
 OSError: [WinError 145] The directory is not empty: 'level1dir' 

Как видно, это вызывает OSError и это правильно. В нем говорится, level1dir каталог level1dir не пуст. Это правильно, потому что под ним level2dir

С помощью rmdir невозможно удалить непустой каталог, как в версии командной строки Unix.

Так же, как метод makedirs() , давайте попробуем rmdirs() , который рекурсивно удаляет каталоги в древовидной структуре.

 os.removedirs('level1dir/level2dir') 

Давайте снова посмотрим на древовидную структуру каталогов:

 list_files(os.getcwd()) 

Выход:

 New York/ 
 New York_population.csv 

Это возвращает нас к предыдущему состоянию каталога.

Пример с обработкой данных

До сих пор мы исследовали, как просматривать, создавать и удалять структуру вложенных каталогов. Теперь давайте посмотрим на примере того, как os помогает в обработке данных.

Для этого поднимемся на один уровень вверх в структуре каталогов.

 os.chdir('../') 

Теперь давайте снова рассмотрим древовидную структуру каталогов.

 list_files(os.getcwd()) 

Выход:

 Population_Data/ 
 Alabama/ 
 Alabama_population.csv 
 Alaska/ 
 Alaska_population.csv 
 Arizona/ 
 Arizona_population.csv 
 Arkansas/ 
 Arkansas_population.csv 
 California/ 
 California_population.csv 
 Colorado/ 
 Colorado_population.csv 
 Connecticut/ 
 Connecticut_population.csv 
 Delaware/ 
 Delaware_population.csv 
 ... 

[Примечание. Вывод был усечен для краткости.]{.small}

Давайте объединим данные из всех состояний, перебирая каталог каждого состояния и аналогичным образом объединяя файлы CSV.

 import os 
 import pandas as pd 
 
 # create a list to hold the data from each state 
 list_states = [] 
 
 # iteratively loop over all the folders and add their data to the list 
 for root, dirs, files in os.walk(os.getcwd()): 
 if files: 
 list_states.append(pd.read_csv(root+'/'+files[0], index_col=None)) 
 
 # merge the dataframes into a single dataframe using Pandas library 
 merge_data = pd.concat(list_states[1:], sort=False) 

Частично благодаря os мы смогли создать merge_data , который представляет собой фрейм данных, содержащий данные о населении из каждого штата.

Заключение

В этой статье мы кратко изучили различные возможности встроенного в Python модуля os Мы также увидели краткий пример того, как модуль можно использовать в мире Data Science и Analytics. Важно понимать, что os система может предложить гораздо больше, и, исходя из потребностей разработчика, можно построить гораздо более сложную логику.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus