Рубрики
Без рубрики

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

Автор оригинала: Guest Contributor.

В этом уроке вы узнаете, как работать вместе с модулем Python 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 :

print(os.listdir())

Выход:

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

Как видите, у меня есть 2 папки: Data и Population_Data . У меня также есть 3 файла: README.md файл markdown и два файла 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
        ...

Примечание: Выходные данные были усечены для краткости.

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

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

Давайте изменим рабочий каталог и войдем в каталог данных со штатом “Нью-Йорк”.

os.chdir('Population_Data/New York')

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

list_files(os.getcwd())

Выход:

New York/
    New York_population.csv

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

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

Теперь давайте создадим в этом каталоге новый каталог с именем 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 "", line 1, in 
    os.mkdir('level1dir/level2dir')

FileNotFoundError: [WinError 3] The system cannot find the path specified: 'level1dir/level2dir'

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

Причина: модуль Python ищет каталог с именем level1 dir для создания каталога level 2 dir . Поскольку level1 dir не существует, во-первых, он выбрасывает FileNotFoundError .

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

os.makedirs('level1dir/level2dir')

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

list_files(os.getcwd())

Выход:

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

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

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

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

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

os.rmdir('testdir')

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

list_files(os.getcwd())

Выход:

New York/
    New York_population.csv
    level1dir/
        level2dir/

Как вы можете видеть, testdir был удален.

Давайте попробуем удалить вложенную структуру каталогов level1 dir и level 2 dir .

os.rmdir('level1dir')

Выход:

OSError
Traceback (most recent call last)
 in ()
----> 1 os.rmdir('level1dir')

OSError: [WinError 145] The directory is not empty: 'level1dir'

Как видно, это вызывает OSError и правильно. Он говорит, что каталог level1 dir не пуст. Это правильно, потому что под ним находится level 2 dir .

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

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

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
...

Примечание: Выходные данные были усечены для краткости.

Давайте объединим данные из всех состояний, повторяя каталог каждого состояния и аналогично объединяя 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 . Мы также увидели краткий пример того, как модуль может быть использован в мире науки о данных и аналитики. Важно понимать, что os может предложить гораздо больше, и исходя из потребностей разработчика может быть построена гораздо более сложная логика.