# os.path
This module implements some useful functions on pathnames. The path parameters can be passed as either strings, or bytes. Applications are encouraged to represent file names as (Unicode) character strings.
# Join Paths
To join two or more path components together, firstly import os module of python and then use following:
import os os.path.join('a', 'b', 'c')
The advantage of using os.path is that it allows code to remain compatible over all operating systems, as this uses the separator appropriate for the platform it’s running on.
For example, the result of this command on Windows will be:
>>> os.path.join('a', 'b', 'c') 'a\b\c'
>>> os.path.join('a', 'b', 'c') 'a/b/c'
# Path Component Manipulation
To split one component off of the path:
>>> p = os.path.join(os.getcwd(), 'foo.txt') >>> p '/Users/csaftoiu/tmp/foo.txt' >>> os.path.dirname(p) '/Users/csaftoiu/tmp' >>> os.path.basename(p) 'foo.txt' >>> os.path.split(os.getcwd()) ('/Users/csaftoiu/tmp', 'foo.txt') >>> os.path.splitext(os.path.basename(p)) ('foo', '.txt')
# Absolute Path from Relative Path
>>> os.getcwd() '/Users/csaftoiu/tmp' >>> os.path.abspath('foo') '/Users/csaftoiu/tmp/foo' >>> os.path.abspath('../foo') '/Users/csaftoiu/foo' >>> os.path.abspath('/foo') '/foo'
# Get the parent directory
os.path.abspath(os.path.join(PATH_TO_GET_THE_PARENT, os.pardir))
# If the given path exists.
to check if the given path exists
path = '/home/john/temp' os.path.exists(path) #this returns false if path doesn't exist or if the path is a broken symbolic link
# check if the given path is a directory, file, symbolic link, mount point etc.
to check if the given path is a directory
dirname = '/home/john/python' os.path.isdir(dirname)
to check if the given path is a file
filename = dirname + 'main.py' os.path.isfile(filename)
to check if the given path is symbolic link
symlink = dirname + 'some_sym_link' os.path.islink(symlink)
to check if the given path is a mount point
mount_path = '/home' os.path.ismount(mount_path)
# Syntax
- os.path.join(a, *p)
- os.path.basename(p)
- os.path.dirname(p)
- os.path.split(p)
- os.path.splitext(p)
Pathосные новшества JDK7. Работа с файловой системой
Данная статья является вольным переводом с авторскими комментариями учебного пособия компании Oracle, по работе с системой ввода-вывода, файлами, папками, реализованной в пакете java.nio.file. Сами разработчики предупреждают, что информация находится в процессе разработки и коррекции ошибок(в ожидании релиза JDK7), и предоставляется нам как ознакомительная, что, в прочем, не мешает нам использовать ее уже сейчас. Чтобы вывести изложение из чисто теоретического ключа, к более практическому, я сфокусирую внимание на тех «вкусностях», что помогут желающим написать, н-р, свой файловый менеджер. Итак, опустив вводную про то, что такое имя файла, структура файловой системы и прочее, приступим.
Класс Path
Прежде чем перейти к более интересному материалу, необходимо рассмотреть базовый класс Path.
Класс Path включает в себя различные методы, которые могут быть использованы для получения информации о пути, получения доступа к элементам пути, преобразования пути в другие формы, извлечения части пути. Существуют также методы для сравнения строк пути и методы для удаления избыточности.
Для создания экземпляра класса Path, воспульзуемся статическим методом get класса Paths, позволяющего создать путь из строки или URI.
Path path1 = Paths. get ( «/home/iam/folder» ) ;
Path path2 = Paths. get ( «C: \\ this \\ my \\ folder» ) ;
Path path3 = Paths. get ( «file:///Users/user/myfile.txt» ) ;
После того как экземпляр Path создан, мы можем получить некоторую информацию о пути:
//Path path = Paths.get(«C:\\home\\joe\\foo»); // Microsoft Windows syntax
Path path = Paths. get ( «/home/iam/folder» ) ; // Solaris syntax
System . out . format ( «toString: %s%n» , path. toString ( ) ) ; //—>/home/iam/folder
System . out . format ( «getName: %s%n» , path. getName ( ) ) ; //—>folder
System . out . format ( «getName(0): %s%n» , path. getName ( 0 ) ) ; //—>home
System . out . format ( «getNameCount: %d%n» , path. getNameCount ( ) ) ; //—>3
System . out . format ( «subpath(0,2): %d%n» , path. subpath ( 0 , 2 ) ) ;
System . out . format ( «getParent: %s%n» , path. getParent ( ) ) ; //—>/home/iam/
System . out . format ( «getRoot: %s%n» , path. getRoot ( ) ) ; //—>/
System . out . format ( «isHidden: %s%n» , path. isHidden ( ) ) ; //—>false
метод subpath остался без вывода не случайно. Он упорно не хочет работать ни в Win7 ни Ubuntu, о чем я сообщил куда надо. Хотя этот пример взят с оригинального туторала, а в прочем это не единственная ошибочка.
Файлы и атрибуты файлов. Управление метаданными.
- BasicFileAttributeView – базовые атрибуты, поддерживаемые всеми реализациями файловых систем.
- DosFileAttributeView – расширяет базовые атрибуты, добавлением стандартных четырех бит, которые используются системами, поддерживающими атрибуты DOS.
- PosixFileAttributeView – поддержка атрибутов стандарта POSIX. Атрибуты включают в себя владельца файла( file owner), группу(group owner), и уровни прав доступа(access permissions).
- FileOwnerAttributeView – поддерживается всеми системами, реализующими концепцию владельца файла.
- AclFileAttributeView – поддерживает чтение и модификацию списков управления доступом файла( Access Control Lists (ACL)). Поддерживается модель NFSv4 ACL. Любая модель ACL, такая как Windows ACL, имеющая проработанную систему отображения к модели NFSv4, также должна поддерживаться.
- UserDefinedFileAttributeView – реализация поддержки пользовательских метаданных.
import java.io.IOException ;
import java.nio.file.Path ;
import java.nio.file.Paths ;
import java.nio.file.attribute.* ;
public class Main < /** * @param args the command line arguments */ public static void main ( String [ ] args ) throws IOException < // TODO code application logic here Path file = Paths. get ( «/home/aum/Downloads/demotivatory_15.jpg» ) ; BasicFileAttributes attr = Attributes . readBasicFileAttributes ( file ) ; if ( attr. creationTime ( ) != null ) < System . out . println ( «creationTime: » + attr. creationTime ( ) ) ; >
if ( attr. lastAccessTime ( ) != null ) < System . out . println ( «lastAccessTime: » + attr. lastAccessTime ( ) ) ; >
if ( attr. lastModifiedTime ( ) != null ) < System . out . println ( «lastModifiedTime: » + attr. lastModifiedTime ( ) ) ; >
System . out . println ( «isDirectory: » + attr. isDirectory ( ) ) ;
System . out . println ( «isOther: » + attr. isOther ( ) ) ;
System . out . println ( «isRegularFile: » + attr. isRegularFile ( ) ) ;
System . out . println ( «isSymbolicLink: » + attr. isSymbolicLink ( ) ) ;
System . out . println ( «size: » + attr. size ( ) ) ;
>
>
Результат:
run:
lastAccessTime: 2011-02-14T14:16:32Z
lastModifiedTime: 2011-02-04T02:17:27Z
isDirectory: false
isOther: false
isRegularFile: true
isSymbolicLink: false
size: 64613
BUILD SUCCESSFUL (total time: 0 seconds)
На этом вводную предлагаю считать завершенной. За бортом осталось множество методов «синтаксической» работы с Path: удаление избыточности в пути, преобразование к абсолютному пути, сравнение путей, создание путей из объеденения и т.п. Всю необходимую информацию вы можете найти здесь (класс Path) И теперь мы смело можем перейти к более сложному, но и более интересному материалу.
Обход дерева файлов
Получение информации о папках и файлах на диске, довольно типичная задача для прикладных программ. Пакет java.nio.file предлагает нам удобное решение такой задачи, предоставляя интерфейс FileVisitor.
FileVisitor определяет требуемое поведение в ключевых точках прохождения процесса: когда файл посещен, прежде чем получить доступ к каталогу, после получения доступа к каталогу, или в случае отказа. Интерфейс состоит из пяти(! оставлю слово пять из оригинального текста, хотя как не старался нашел только 4! метода ) методов, которые соответствуют этим ситуациях:
- preVisitDirectory – вызывается до входа в папку
- postVisitDirectory – вызывается после «просмотра» всех объектов каталога. В случае возникновения ошибки, вызывается исключение и передается методу
- visitFile – вызывается для получения информации о файле, обрабатываемом в данный момент. В метод передаются атрибуты файла BasicFileAttributes, или мы можем передать определенный набор атрибутов, н-р можем выбрать чтение атрибутов DosFileAttributeView, чтобы определить является ли файл скрытым(«hidden»).
- visitFileFailed – вызывается при невозможности получить доступ к файлу. В этом случае вызывается исключение и передается методу. Обработка этого события может быть различной(вызов исключения, запись в лог или вывод информации на консоль и т.д.
import java.nio.file.FileVisitOption ;
import java.util.EnumSet ;
import java.nio.file.Files ;
import java.nio.file.Paths ;
import java.io.IOException ;
import java.nio.file.FileVisitResult ;
import java.nio.file.Path ;
import java.nio.file.SimpleFileVisitor ;
import java.nio.file.attribute.BasicFileAttributes ;
import static java. nio . file . FileVisitResult . *;
//Используем класс SimpleFileVisitor, который реализовывает методы интерфейса FileVisitor
public class PrintFiles extends SimpleFileVisitor < Path >< //Выводим информацию о обрабатываемом в данный момент файле. // метод Files.probeContentType выводит информацию о типе контента @Override public FileVisitResult visitFile ( Path file, BasicFileAttributes attr ) throws IOException < if ( attr. isSymbolicLink ( ) ) < System . out . format ( «Symbolic link: %s » , file ) ; > else if ( attr. isRegularFile ( ) ) < System . out . format ( «Regular file: %s Content is %s%n » , file,Files. probeContentType ( file ) ) ; > else < System . out . format ( «Other: %s » , file ) ; >
System . out . println ( «(» + attr. size ( ) + «bytes)» ) ;
return CONTINUE ;
>
//Выводим информацию о посещенном каталоге
@Override
/* Перечисление FileVisitResult имеет следующие варианты
CONTINUE продолжить проход.
SKIP_SIBLINGS продолжить проход без осмотра дочерних папок.
SKIP_SUBTREE продолжить без просмотра объектов данной папки.
TERMINATE заверщить.
*/
public FileVisitResult postVisitDirectory ( Path dir, IOException exc ) < System . out . format ( «Directory: %s%n» , dir ) ; return CONTINUE ; >
//в случае ошибки доступа к файлу выбрасывается исключение IOException
@Override
public FileVisitResult visitFileFailed ( Path file, IOException exc ) < System . err . println ( exc ) ; return CONTINUE ; >
public static void main ( String [ ] args ) throws IOException < //создаем объект Path Path startingDir = Paths. get ( «/home/aum/myjobs/» ) ; //создаем экземпляр нашего класса, реализующего FileVisit PrintFiles pf = new PrintFiles ( ) ; //создаем экземпляр EnumSet, необходимый нам как параметр, и указывающий, // что программа при прохождении дерева файлов, следует по ссылкам EnumSet < FileVisitOption >options = EnumSet. of ( FileVisitOption. FOLLOW_LINKS ) ;
int maxDepth = 2 ; //максимальное число уровней каталога для просмотра
/* Запуск анализа дерева файлов. Используется один из методов класса Files*/
Files. walkFileTree ( startingDir, options, maxDepth, pf ) ;
>
>
Результат
run:
Regular file: /home/aum/myjobs/sys.txt Content is text/plain
(11362bytes)
Regular file: /home/aum/myjobs/vzriv.mp3 Content is audio/mpeg
(2336827bytes)
Regular file: /home/aum/myjobs/report.html Content is text/html
(24574bytes)
Regular file: /home/aum/myjobs/examples.desktop Content is application/x-desktop
(179bytes)
Directory: /home/aum/myjobs/java
Directory: /home/aum/myjobs
BUILD SUCCESSFUL (total time: 0 seconds)
И в завершении о производительности. Н-р, код указаный выше, выполняется (на моем каталоге /home) так:
Objects found 19931 Total Size 2329851621 byte
BUILD SUCCESSFUL (total time: 38 seconds)
системные характеристики
Ubuntu 10.4
Kernel Linux 2.6.32-28
Gnom 2.30.2
Memory 1.9 G
Intel® Core(TM) i3 CPU M330 @ 2.13 GHz
Более полную информацию можно получить здесь
. что такое переменная среды PATH?
Когда операционная система запускает какую-нибудь программу, она стартует новый процесс и каким-то образом передаёт ему информацию о настройках среды, или окружения (в английском языке используется термин environment). Эта информация состоит из набора переменных, содержащих некоторые значения. Процесс может получить эти значения, обратившись к нужной переменной по имени. Например, чтобы узнать, где находится директория, которую операционная система рекомендует использовать для хранения временных файлов, необходимо получить значение переменной среды TEMP .
Как посмотреть значения переменных среды?
В консоли Windows можно посмотреть значение этой переменной, выполнив команду echo %TEMP% , в консоли PowerShell необходимо для этого выполнить команду echo $Env:TEMP , а в консоли Linux или MacOS – команду echo $TEMP .
Если вы пишете программу на языке программирования Python, значение этой переменной можно получить так:
import os temp = os.environ["TEMP"]
В языке Java это можно сделать следующим образом:
String temp = System.getenv().get("TEMP");
В языке C# аналогичное действие выглядит следующим образом:
string temp = System.Environment.GetEnvironmentVariable("TEMP");
На что влияет переменная среды PATH ?
При помощи переменных среды можно передавать информацию не только запускаемым процессам, но и самой операционной системе. Она тоже читает и использует значения переменных среды, поэтому можно управлять некоторыми аспектами поведения операционной системы, изменяя эти переменные.
Переменная PATH содержит список директорий, в которых операционная система пытается искать исполняемые файлы, если пользователь при запуске не указал явно путь к нужному исполняемому файлу.
Давайте представим себе, что на компьютере с операционной системой Windows установлено две разных версии интерпретатора языка программирования Python. Это можно сделать, если установить их в разные директории, например, C:\Python27 и C:\Python34 . Исполняемый файл для обоих версий называется python.exe .
Для того, чтобы запустить исполняемый файл нужной версии, можно указать полный путь к нему, например, C:\Python34\python.exe :

Но каждый раз указывать полный путь лень, да ещё и помнить его надо.
Альтернатива – добавить в переменную среды PATH путь к директории, где находится этот исполняемый файл, и тогда его можно будет запускать, указывая только имя. А чтобы узнать, где он (по мнению операционной системы) находится, можно использовать команду where в операционной системе Windows либо команду which в операционной системе Linux или MacOS.

Переменная PATH содержит список директорий, в которых операционная система должна искать исполняемые файлы. В качестве разделителя используется точка с запятой (;) в операционной системе Windows и двоеточие (:) в операционных системах Linux и MacOS.
Обратите внимание, что в переменную PATH нужно добавлять не пути к исполняемым файлам, а пути к директориям, где они находятся!
Переменная PATH и программы-утилиты
Не обязательно добавлять в переменную PATH пути ко всем директориям, в которых находятся исполняемые файлы на вашем компьютере. Скорее всего большинство программ вы запускаете “через меню старт”. На этот способ запуска переменная PATH никакого влияния не оказывает. Её важно настроить так, чтобы можно было быстро и удобно запускать программы из консоли.
Например, в эту переменную обычно включается путь к “стандартным” местам, где расположены различные программы-утилиты. В операционной системе Windows это директория C:\Windows\system32 , в операционных системах Linux и MacOS директория /usr/bin .
Именно благодаря этому мы можем, например, в консоли Windows использовать утилиту find для поиска файлов или утилиту telnet для установления удалённого соединения по одноимённому протоколу, просто указывая их имя, а не полный путь c:\Windows\system32\telnet.exe .
Когда у вас появляется новая программа-утилита, возникает вопрос – куда её поместить? С одной стороны, её можно положить в C:\Windows\system32 или /usr/bin . Но если вы не любите “засорять” стандартные директории, тогда сделайте какую-нибудь специальную директорию, складывайте все такие программы в неё, и добавьте путь к этой директории в переменную среды PATH .
Как изменять значения переменных среды?
Пользователям других операционных систем предлагаю погуглить 🙂
Переменную поменял, но эффекта нет. Почему?
Когда вы меняете значение некоторой переменной среды, об этом узнаёт только операционная система. При запуске новых программ она сообщит им новые значения переменных. Но ранее запущенные программы будут продолжать использовать те значения переменных среды, которые были актуальны на момент запуска программы.
Поэтому после изменения переменных среды придётся перезапустить те программы, которым необходимо сообщить новые значения переменных.

August 23
2016
Автор: Алексей Баранцев
Если вам понравилась эта статья, вы можете поделиться ею в социальных сетях (кнопочки ниже), а потом вернуться на главную страницу блога и почитать другие мои статьи.
Ну а если вы не согласны с чем-то или хотите что-нибудь дополнить – оставьте комментарий ниже, может быть это послужит поводом для написания новой интересной статьи.
Переменная окружения PATH
Довольно часто на наших курсах нам приходится работать с различными переменными окружения. Особый интерес у учеников вызывает переменная окружения PATH. В этой мини-статье решили рассказать о том, что это за переменная и зачем нужна нашей операционной системе.
Что такое переменная окружения
Для начала давайте определимся с тем, что вообще такое переменная окружения.
Переменная окружения — это то же самое, что и переменная в любом языке программирования. Для тех, кто никогда не писал код, проще всего объяснить это следующим образом. Это некая сущность, у которой есть имя и значение.
Если в языке программирования переменная существует только в рамках какой-то программы, то переменная окружения существует в рамках всей операционной системы и любая программа может к ней обратиться.
Нужны такие переменные как раз для этого — чтобы программы могли к ним обращаться и получать требующуюся им для работы информацию.
Например, давайте представим, что мы пишем программу, которая в ходе своей работы должна взаимодействовать с Java. На каждом компьютере она может находиться в разных местах. У меня в одной директории, у другого человека — в другой. Как нам написать программу, которая работала бы у всех?
Очень просто, мы пишем требование к нашей программе — в системе, где вы будете ее запускать, обязательно должна быть выставлена переменная окружения JAVA_HOME, содержащая путь до Java. Читая значение этой переменной наша программа будет понимать, где искать движок на том компьютере, на котором ее запустили.
Переменная окружения PATH
Переменная окружения PATH нужна прежде всего самой командной строке. Ее значение — это список директорий, в которых хранятся исполняемые файла. Директории перечислены через двоеточие. Например:
Тут две директории, перечисленные через двоеточие:
Сама по себе командная строка не знает, как выполнять какую-либо команду, которую мы вводим. После ее введения оболочка начинает поиск исполняемого файла этой команды как раз среди директорий, перечисленных в PATH.
Переменная окружения PATH существует как в Linux, так и в MacOS и Windows и везде работает одинаково.
По дефолту в PATH лежат только основные директории, но мы можем добавлять туда и новые после установки каких-то новых программ.
Дальнейшие команды будут работать только в командной оболочке bash в операционных системах Linux (например, Ubuntu) и MacOS. Если у вас Windows, повторить их можно, установив специальное расширение cygwin по нашему видео — https://www.youtube.com/watch?v=2csABC85onI
Чтобы узнать, какие директории уже указаны в PATH, можно распечатать ее содержимое:
Если директорий много, в таком виде читать ее содержимое не очень удобно и мы предлагаем использовать следующую команду:
Так получится гораздо нагляднее.
Чтобы узнать, в какой директории лежит исполняемый файл той или иной команды, необходимо ввести команду which. Например, давайте посмотрим, где лежит исполняемый файл команды ls:
Как редактировать переменную окружения PATH?
Для ОС Windows версии 8 и 10:
В строке «Поиск» выполните поиск: Система (Панель управления)
Нажмите на ссылку “Дополнительные параметры системы”
Нажмите “Переменные среды”
В разделе “Переменные среды” выберите переменную среды PATH
Нажмите “Изменить”
Если переменной PATH не существует, нажмите “Создать”
В окне “Изменение системной переменной” (или “Новая системная переменная”) укажите значение переменной среды PATH
Нажмите “ОК”
Откройте заново окно командной строки (если она была открыта)
Для MacOS и Linux переменная окружения PATH обычно дополняется через системные файлы .bashrc и .bash_profile
Вот и все, что нужно знать о переменной окружения PATH, чтобы начать с ней работать.
Приходите на наш курс Bash — инструменты тестировщика, там мы рассказываем это и многое другое для того, чтобы наши ученики чувствовали себя уверенным пользователем Linux и MacOS и могли эффективно работать с любой командной оболочкой.
А если хочешь почувствовать себя настоящим профессионалом командной строки, покупай пакет курсов Консольные утилиты PRO с хорошей скидкой.
Учитесь новому каждый день! 🙂