В этом руководстве вы узнаете, как работать вместе с модулем os
Оглавление
- Вступление
- Основные функции
- Список файлов / папок в текущем рабочем каталоге
- Изменить рабочий каталог
- Создание единой и вложенной структуры каталогов
- Рекурсивное удаление одиночной и вложенной структуры каталогов
- Пример с обработкой данных
- Заключение
Вступление
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
система может предложить гораздо больше, и, исходя из потребностей
разработчика, можно построить гораздо более сложную логику.