Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Язык программирования высокого уровня Python. Функции, структуры данных, дополнительные модули. Учебное пособие
.pdf
6. Модуль OS для работы в файловой системе
7. listdir(Путь) – возвращает список объектов в указанном ка-
талоге
import os
print ("Обход директорий для заданного пути
(os.listdir)")
for d in os.listdir("c:"):
print (d)
7. walk() – позволяет обойти дерево каталогов. В качестве значения возвращает объект, из которого можно получить кортеж из трех элементов: текущий каталог, список каталогов и список файлов.
Необязательный параметр topdown задает последовательность обхода каталога. Если в качестве значения указано True, то последовательность обхода будет следующей: сначала в глубь каталога, затем в следующий.
Формат функции:
walk(Начальный_каталог[,topdown=True][,onerror=None]
[,followlinks=False])
Обычно метод walk используется в цикле for:
import os
print ("Полный обход вглубь заданного пути
(os.walk)")
for path, dirs, files in
os.walk('c:\\windows\\system32'):
print 'Path', path
print 'Dirs', dirs
print 'Files', files
8. rename(Старое_Имя, Новое_Имя) – переименование файла.
Если файл отсутствует или новое имя файла уже существует, возбуждается исключение.
41

6. Модуль OS для работы в файловой системе
import os
# переименование
os.rename("AAA\\file.txt", "AAA\\super_file.txt")
Функция listdir() возвращает список объектов в указанном каталоге. Проверить, на какой тип объекта ссылается элемент этого списка,
можно с помощью следующих функций из модуля OS:
1. isdir(Объект) – возвращает True, если объект является ката-
логом.
import os.path
print "Проверка, указывает ли заданный путь на
директорию"
print os.path.isdir('c:\\python26\\LICENSE.txt')
2. isfile() возвращает True, если объект является файлом.
import os.path
print "Проверка, указывает ли заданный путь на
файл"
print
(os.path.isfile('c:\\python26\\LICENSE.txt'))
Преобразование пути к файлу или каталогу
При преобразовании пути в Windows следует учитывать, что слэш
является специальным символом. Поэтому все специальные символы
необходимо экранировать слэшем, либо использовать неформатированные строки (r’C:\temp\new’)
Преобразовать путь к файлу или каталогу позволяют следующие
функции из модуля os.path:
1. abspath(Относительный путь) – преобразует относительный путь в абсолютный, учитывая местоположение текущего рабочего
каталога.
import os.path
print "Преобразуем относительный путь в абсолютный"
print os.path.abspath(r'test.py')
42

6. Модуль OS для работы в файловой системе
print os.path.abspath('..') # на директорию выше
от текущей
2. split(Путь) – возвращает кортэж из двух элементов: пути к ка-
талогу и названия файла.
import os.path
print "Разделение заданного пути на путь к директории и имя файла"
dir_file_name = os.path.split(r'C:\temp\data.txt')
#Результат ('C:\temp’, data.txt)
или
import os.path
print "Разделение заданного пути на путь к директории и имя файла"
dir_path, file_name =
os.path.split(r'C:\temp\data.txt')
print dir_path, file_name
3. join(Путь[, … , Путь]) – соединяет указанные элементы
пути.
import os.path
print "Объединение пути и имени файла (с правильным разделителем
в ОС)"
os.path.join(r'C:\\temp', 'output.txt')
#Результат: 'C:\\temp\\output.txt'
Другие методы модуля os.path:
os.path.getatime(path) время последнего доступа к файлу, в секун-
дах.
os.path.getmtime(path) время последнего изменения файла, в секун-
дах.
os.path.getctime(path) время создания файла (Windows), время по-
следнего изменения файла (Unix).
os.path.splitext(path) разбивает путь на пару (root, ext), где ext начи-
нается с точки и содержит не более одной точки.
43

7. МОДУЛЬ MATH
math.ceil(X) – округление до ближайшего большего числа.
math.copysign(X, Y) возвращает число, имеющее модуль такой же, как
и у числа X, а знак как у числа Y.
math.fabs(X) модуль X.
math.factorial(X) факториал числа X.
math.floor(X) округление вниз.
math.fmod(X, Y) остаток от деления X на Y.
math.frexp(X) возвращает мантиссу и экспоненту числа.
math.ldexp(X, I) - X * 2i. Функция, обратная функции math.frexp().
math.fsum(последовательность) сумма всех членов последовательности.
Эквивалент встроенной функции sum(), но math.fsum() более точна для
чисел с плавающей точкой.
math.isfinite(X) является ли X числом.
math.isinf(X) является ли X бесконечностью.
math.isnan(X) является ли X NaN (Not a Number - не число).
math.modf(X) возвращает дробную и целую часть числа X. Оба числа
имеют тот же знак, что и X.
math.trunc(X) усекает значение X до целого.
math.exp(X) eX.
math.expm1(X) eX - 1. При X → 0 точнее, чем math.exp(X)-1.
math.log(X, [base]) логарифм X по основанию base. Если base не указан,
вычисляется натуральный логарифм.
math.log1p(X) натуральный логарифм (1 + X). При X → 0 точнее, чем
math.log(1+X).
math.log10(X) логарифм X по основанию 10.
math.log2(X) логарифм X по основанию 2. Новое в Python 3.3.
math.pow(X, Y) - XY.
math.sqrt(X) квадратный корень из X.
math.acos(X) арккосинус X. В радианах.
math.asin(X) арксинус X. В радианах.
math.atan(X) арктангенс X. В радианах.
44

7. Модуль math
math.atan2(Y, X) арктангенс Y/X. В радианах. С учетом четверти, в ко-
торой находится точка (X, Y).
math.cos(X) косинус X (X указывается в радианах).
math.sin(X) синус X (X указывается в радианах).
math.tan(X) тангенс X (X указывается в радианах).
math.hypot(X, Y) вычисляет гипотенузу треугольника с катетами X и Y
(math.sqrt(x * x + y * y)).
math.degrees(X) конвертирует радианы в градусы.
math.radians(X) конвертирует градусы в радианы.
math.cosh(X) вычисляет гиперболический косинус.
math.sinh(X) вычисляет гиперболический синус.
math.tanh(X) вычисляет гиперболический тангенс.
math.acosh(X) вычисляет обратный гиперболический косинус.
math.asinh(X) вычисляет обратный гиперболический синус.
math.atanh(X) вычисляет обратный гиперболический тангенс.
math.erf(X) функция ошибок.
math.erfc(X) дополнительная функция ошибок (1 - math.erf(X)).
math.gamma(X) гамма-функция X.
math.lgamma(X) натуральный логарифм гамма-функции X.
math.pi pi = 3,1415926...
math.e e = 2,718281...
45

8. ЯЗЫК РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
Регулярные выражения (РВ) это меленький формальный язык,
позволяющий осуществить сложный поиск и работу (замены) с подстроками в тексте, основанный на использовании шаблонов. Регулярные выражения используются только для работы только со строковыми типами
данных (str).
Шаблон (маска) – это строка-образец (англ. pattern), задающая пра-
вило поиска подстроки в строке или тексте, и состоящая из символов текста и специальных символов (метасимволов).
Регулярные выражения используются некоторыми текстовыми редакторами для поиска и подстановки текста. Например, при помощи регулярных выражений можно задать шаблоны, позволяющие:
- найти все последовательности символов «кот» в любом контексте,
как то: «кот», «котлета», «терракотовый»;
- найти отдельно стоящее слово «кот» и заменить его на «кошка»;
- найти слово «кот», которому предшествует слово «персидский»
или «чеширский»;
- убрать из текста все предложения, в которых упоминается слово
кот или кошка.
Язык регулярных выражений относительно мал и ограничен, поэтому не все возможные задачи по обработке строк можно сделать с помощью регулярных выражений. Также существуют задачи, которые можно
сделать с помощью регулярных выражений, но выражения оказываются
слишком сложными. В этих случаях возможно лучше написать обычный
Python-код, даже если он будет работать медленнее, чем регулярное выражение, но будет более понятен.
Язык регулярных выражений встроен в Python и доступен при помощи модуля re. Подключить модуль re можно с помощью инструкции
[2, 3, 12]:
import re
Синтаксис шаблонов
Для того, чтобы осуществить сложный поиск в строке или изменить
ее или разбить на части с помощью регулярных выражений, необходимо
создать шаблон (строку-образец).
46

8. Язык регулярных выражений
Метасимволы [ ] \ / ^ $ . | ? * + ( ) { } < >
Пример шаблона
Соответствующий результат поиска
”a\.?”
a. или a
”a\\\\b”
a\\b
”a\[F\]”
a[F]
”\Q+-*/ \E”
+-*/
В общем виде формат шаблона представляет собой
последовательность символов, каждый из которых может быть снабжен
набором специальных символов (метасимволами), задающих условия
поиска символа в тексте:
”[Символ_1][Специальные символы] …
[Символ_N][Специальные символы]”
Специальные символы регулярных выражений
В регулярных выражениях к специальным символам (метасимволам)
относятся такие символы, как [ ] \ / ^ $ . | ? * + ( ) { } < >. Для
представления самих метасимволов в качестве символов текста, их необходимо «экранировать» символом \ (обратная косая черта). Можно экранировать целую последовательность символов, заключив её между \Q и
\E.
Можно выделить несколько видов специальных символов
(метасимволов) в зависимости от заданных условий поиска:
1) символьные классы,
2) метасимволы, задающие позицию внутри текста, строки или слова,
3) квантификаторы (специальные символы, определяющие сколько
раз предшествующее выражение может встречаться),
4) метасимволы группы,
5) метасимволы комментариев,
6) метасимволы перечислений,
7) метасимволы просмотра вперед.
47

8. Язык регулярных выражений
\d
[0-9]
\D
[^0-9]
\s
[ \f\n\r\t\v]
\S
[^ \f\n\r\t\v]
\w
[[a-zA-Z0-9_]]
\W
[^a-zA-Z0-9_]
Список последовательностей специальных символов, которые
используются в шаблонах регулярных выражений :
Символьные классы
Символьный класс – набор символов в квадратных скобках [ ],
который указывает интерпретатору регулярных выражений, что на данном месте в строке может находиться один из перечисленных внутри
квадратных скобок символов.
Например, символьный класс [абв] задаёт возможность появления
в тексте одного из трёх указанных символов, а символьный класс
[0123456789] – одной из цифр. Возможно указание диапазонов символов через тире: например, [А-Яа-яёЁ] соответствует всем буквам русского алфавита, за исключением букв «Ё» и «ё».
Для исключения какого-либо набора символов, которых не должно
быть на этом месте в строке, используется символ ^ внутри квадратных
скобок. Например, [^0-9] соответствует любому символу, кроме цифр.
Буква «ё» не входит в диапазон [ая]
Внимание!!!
Некоторые символьные классы можно заменить специальными метасимволами:
Метасимвол
Символьный
класс
Соответствующий результат
поиска
48
Один цифровой символ
Один нецифровой символ
Один пробельный символ
Один непробельный символ
Один буквенный или цифровой символ или
знак подчёркивания
Один любой символ, кроме буквенного или
цифрового символа или знака подчёркивания

8. Язык регулярных выражений
Метасимвол
Позиция поиска
в строке
Пример
шаблона
Соответствующий результат
поиска
^
Начало текста
”^a”
aaa aaa
$
Конец текста
”a$”
aaa aaa
\b
Граница слова
”a\b”
aaa aaa
”\ba”
aaa aaa
\B
Не граница слова
”\Ba\B”
aaa aaa
\G
Предыдущий
успешный поиск
”\Ga”
aaa aaa (поиск остановился
на 4-й позиции там, где не
нашлось a)
Метасимвол
Число повторений
Пример
шаблона
Соответствующий
результат поиска
{n}
Ровно n раз
colou{3}r
colouuur
{m,n}
От m до n включительно
colou{2,4}r
colouur, colouuur, colouuuur
{m,}
Не менее m
colou{2,}r
colouur, colouuur, colouuuur
и т. д.
{,n}
Не более n
colou{,3}r
color, colour, colouur,
colouuur
Метасимволы, задающие позицию внутри текста, строки или слова
Следующие специальные символы позволяют осуществлять поиск
регулярного выражения относительно начала и конца строки или границ
слова:
Квантификаторы
Квантификатор после символа, символьного класса или группы
определяет, сколько раз предшествующее выражение может встречаться
(количество вхождений символов в строку). Следует учитывать, что квантификатор может относиться более чем к одному символу в регулярном
выражении, только если это символьный класс или группа.
49

8. Язык регулярных выражений
Метасимвол
Число
повторений
Эквивалент
Пример
Соответствующий
результат поиска
?
Ноль или одно
{0,1}
colou?r
color, colour
*
Ноль или более
{0,}
colou*r
color, colour, colouur
и т. д.
+
Одно или более
{1,}
colou+r
colour, colouur и т. д.
(но не color)
Символьные классы в сочетании с квантификаторами позволяют
устанавливать соответствия с реальными текстами. Например, столбцами
цифр, телефонами, почтовыми адресами, элементами HTML-разметки и
др.
«Жадные» квантификаторы
Все квантификаторы являются «жадными». То есть при поиске соответствия ищется самая длинная подстрока, соответствующая шаблону, и
не учитываются более короткие соответствия.
Пример:
s = ”<b>Text1</b>Text2<b>Text3</b>”
p = re.compile(r”<b>.*</b>”, re.S)
p = findall(s)
#Результат [‘<b>Text1</b>Text2<b>Text3</b>’]
Ограничение «жадности» квантификаторов
Проблему «жадности» квантификаторов можно решить двумя спосо-
бами.
1. Учитывать символы, не соответствующие желаемому образцу.
2. Определить квантификатор как нежадный (ленивый, англ. lazy),
добавив после него знак вопроса.
Пример:
s = ”<b>Text1</b>Text2<b>Text3</b>”
p = re.compile(r”<b>.*?</b>”, re.S)
p.findall(s)
#Результат [’<b>Text1</b>’, ’<b>Text3</b>’]
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
