Файловая система. Строки. Списки.
Basics of Python and Django. -> Консоль. Алиасы.
BASH Алиасы.
Часто возникает необходимость в консоле создать собственную команду.
Напимер для того, чтобы запустить последовательно ряд повторяющихся команд.
К примеру, команду, которая добавляет файлы в индекс git и комитит изменения на сервер.
Такая операция проводится довольно часто и состоит из 3-х шагов.
-
добавление файло в индекс для отслеживания;
-
совершение комита;
-
загрузка изменений на удаленный сервер.
Создадаим выполняемый скрипт для этого autocomit.sh.
git add --all
git commit -m 'auto commit'
git push
Добавим права на выполнение.
chmod +x ./autocomit.sh
Теперь чтобы создать свою команду, можно воспользоваться alias-ом, определив его в файле, который будет выполняться каждый раз когда вы открываете терминальную сессию.
Одним из таких файлов являются .bashrc, он запускается первым.
Добавим в него следующий alias и назовем его agit.
alias agit='./path/to/script/autocomit.sh'
Теперь при перезагрузке терминала эта команда станет доступна.
Basics of Python and Django. -> Файлы, каталоги.
Библиотека os. Работа с файловой системой.
Ссылка на официальную документацию
import os
print('OS module!')
print(__file__)
print(os.path.realpath(__file__))
print(os.path.dirname(os.path.realpath(__file__)))
Вывод
OS module!
os-exmpl.py
/home/zdimon/storage1/www/wm_ve/data/python-beginner/ru/2-os-string/code/os-exmpl.py
/home/zdimon/storage1/www/wm_ve/data/python-beginner/ru/2-os-string/code
os.path.realpath - абсолютный путь с именем файла os.path.dirname - абсолютный путь без имени файла
Текущая рабочая директория.
path = os.getcwd()
Создание и удаление директорий.
newdir = 'new'
os.mkdir(newdir)
Если нужно создать сразу структуру директорий.
path = "year/month/week/day"
os.makedirs(path)
Удаление одной директории.
os.rmdir(path)
Если нужно удалить непустую директорию то можно использовать модуль shutil.
import shutil
shutil.rmtree('/folder_name')
Проверка на существование директории.
if os.path.isdir('year'):
print("Deleting year dir")
shutil.rmtree('year')
Работа с путями.
Ссылка на официальную документацию
os.path.join(path1[, path2[, …]]) - соединяет пути с учётом особенностей операционной системы.
os.path.getsize(path) - размер файла в байтах.
Работа с файлами.
Создадим в цикле несколько непустых файлов, записав в них случайное число от 100 до 200.
import random
for i in range(0,5):
rnd = random.randint(100, 200)
f = open(str(rnd)+'.txt','w')
f.write(str(rnd))
f.close()
При открытии файла необходимо указать режим открытия:
- r r+ - для чтения и чтения + записи
- w w+ - открытие для записи w+ - создаст новый пустой если не существует
- a a+ - открыть для добавления в конец файла (позиционирует курсор в конец)
random.randint(A, B) - случайное целое число N, A ≤ N ≤ B.
Открытие оператором with. Чтение файла.
with open('147.txt','r') as f:
data = f.read()
print("Data is %s" % data)
Получение содержимого директории.
print("List directory")
lst = os.listdir('.')
print(lst)
Определение файла или директории.
data = os.listdir('.')
for d in data:
if os.path.isdir(d):
print("Directory is %s" % d)
else:
print("File is %s" % d)
Basics of Python and Django. -> Строки.
Работа со строками.
Длинна
len('Hello')
Доступ по ключу, срез.
ms = 'My string'
print(ms[0])
print(ms[0:3])
Пробуем поменять символ.
ms[1] = 'e'
TypeError: 'str' object does not support item assignment
Строка это неизменяемый тип, поэтому изменять нужно функциями (методами), которые возвращают новый, измененный экземпляр строки.
Например.
ns = ms.replace('M','W')
>> Yy string
Форматирование строк.
Форматирование можно сделать с помощью оператора %, либо с помощью метода format.
Знак %
s = 'hello %s' % 'dima'
d = 'hello %s your number is %d' % ('dima', '4')
Оператор format.
'{}, {}, {}'.format('a', 'b', 'c') # 2.7+ only
'{0}, {1}, {2}'.format('a', 'b', 'c')
'{2}, {1}, {0}'.format('a', 'b', 'c')
Символ f
name = 'Dima'
print(f'Hello {Dima}')
Любая строка это объект питон со всеми атрибутами и методами поэтому вызывать методы можно стразу позле определения строки после кавычек.
Проверка типов.
str = 'x = {x_coord}, y = {y_coord:d}'.format(x_coord=23,y_coord=56)
Форматирование числа.
{:,}'.format(1234567890)
Приведение к одному формату (с нулями впереди).
month = '{:02d}'.format(3)
Отсечение чисел после запятой.
print('{:.2f}'.format(222.3333))
Форматирование даты.
import datetime
n = datetime.datetime.now()
'{:%Y-%m-%d %H:%M:%S}'.format(n)
Разбиение
s = 'one,two,three'.split(',')
Слияние
'-'.join(s)
Поиск
string.find(s)
string.rfind(s)
Возвращает число (позиция) первого вхождения или -1 при неудаче.
string.index(s)
Работает так же как find но вызывает исключение при ненахождении.
Поиск по регулярным выражениям.
import re
str = 'My name is dima. My name is dima.'
rez = re.search('is(.*)\.',str)
print(rez.group(1))
Документация по регулярным выражениям
Изменение регистра
str.capitalize(); str.lower(); str.upper()
Убираем пробелы вначале и в конце.
' spacious '.strip()
Basics of Python and Django. -> Домашнее задание. Строки.
Домашнее задание.
-
Перенести все файлы из одной директории в другую.
-
Прочитать текстовое содержимое из всех файлов каталога и объеденить его в одном файле через разделитель точка с запятой.
-
Есть текстовый файл вида.
file1.txt, file2.txt. file3.dat, file4.log
Необходимо прочитать его содержимое и создать столько же пустых файлов, которые перечислены через запятую.
Дана строка вида.
‘one-two-three-four’
Необходимо переформатировать ее в следующие виды.
‘one;two;three;four’
‘One;Two;Three;Four’
‘1-one;2-two;3-three;4-four’
Basics of Python and Django. -> Домашнее задание. Списки.
Домашнее задание. Списки.
-
Используя генератор списков, создать список, заполненый квадратами целых чисел от 1 до 5.
-
Используя генератор списков, создать список, заполненый 10 случайными числами от 1 до 10, удалить из него повторяющиеся значения.
-
Считать имена файлов внутри текущего каталога и вывести их на экран в виде списка, отсортированного по алфавиту.
-
Дана строка ‘user1:23:user2:45:user3:37’
Преобразовать ее в список.
['user1',23,'user2',45,'user3',37]
затем получившейся список превратить в следующие форматы списков
[['user1',23],['user2',45],['user3',37]]
[['user1','user2','user3'],['23','45','37']]
Игра блек-джек
Дано два списка, с 4-мя мастями и 9 картами.
faces = [1,2,3,4]
cards = [2,3,4,5,6,7,8,9,10]
Необходимо создать новый список колоды карт, в которой будет 36 карт по 9 каждой масти. При этом числа будут повторятся т.е. в колоде будет четыре двойки, четыре тройки и т.д.
В начале игры (запуске программы) пользователю сдается 2 случайные карты (числа). Подсчитывается кол-во набранных очков, и выводится результат и предложение взять еще карту или отказаться.
Например:
У вас такие карты - 3,5 общее количество очков - 8 Хотите взять еще? д\н
Если пользователь соглашается, ему выдается еще одна карта и процесс повторяется пока будет набрано больше 21 очка.
В этом случае пользователю говорят что он проиграл и предлагают повторить игру или выйти из программы.
В случае если пользователь отказывается брать карту вступает в игру компьютер.
Он берет случайные карты до тех пор пока не наберет от 18 очков (включительно) до 21.
Если количество баллов, набранных компьютером находится между 18 и 21 компьютер прекращает брать карты, сравнивает свои очки с очками пользователя и определяет победителя или ничью.
Если компьютер набрал больше 21 то он проигрывает и пользователю предлагается продолжить игру или выйти.
Вопрос что делает этот код?
a = [input() for i in range(int(input()))]
a = [1,2,3,4]
b = a[:]
Basics of Python and Django. -> Списки.
Работа со списками.
Сравнение списка и словаря.
Определение списков.
Списки - перечисляемые структуры разных элементов, заключенные в [] и разделенные запятой.
В основном списки используются в циклах.
Создание списков
list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5];
list3 = ["a", "b", "c", "d"]
Создание с помощью генераторов списка.
[выражение for переменная in последовательность условие]
lst = [i for i in range(30) if i % 3 == 0]
[i for i in range(30) if i % 3 == 0]
Доступ к элементам списка, срезы.
print(list1[0])
print(list2[1:5])
print(1:)
Срез с шагом.
s = [1,2,3,4,5,6,7,8]
d = s[1:7:2]
Вставка списка вместо среза.
A = [1, 2, 3, 4, 5]
A[2:4] = [7, 8, 9]
Основные методы работы со списками.
Изменение списка.
Присвоением.
list = ['physics', 'chemistry', 1997, 2000];
print list[2]
list[2] = 2001;
print list[2]
Добавление элементов.
lst.append(element)
Удаление элементов.
del list1[2];
Получение информации о списке
len(list) # общее количество элементов
max(list) # максимальный элемент
min(list) # минимальный элемент
Сложение.
[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6]
Умножение.
['Hi!'] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!']
Проверка на существование элемента.
3 in [1, 2, 3]
Итерация по списку.
for x in [1, 2, 3]: print x
Встроенные функции для списков.
Сравнение списков
cmp(list1, list2)
Создание списка из кортежа.
list(seq)
Методы списков:
list.append(obj) # добавление нового элемента в конец списка
list.count(obj) # возвращает количество повторений элемента в списке
list.extend(seq) # добавляет новый список в конец (расширяет)
lst = [1,2,3]
lst.extend([4,5,6])
print lst
>> [1, 2, 3, 4, 5, 6]
Нахождение индекса элемента.
list.index(obj)
[1, 2, 3, 4, 5, 6]
>>> print lst.index(2)
1
>>> print lst.index(4)
3
>>> print lst.index(44)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 44 is not in list
list.insert(index, obj) # вставляет элемент в нужную позицию внутрь списка
list.pop() # возвращает последний объект удаляя его из списка
list.remove(obj) # просто удаляет объект из списка
list.reverse() # переворачивает порядок элементов
Преобразование списка в строку с разделителем.
'разделитель'.join(list)
Преобразование строки в список по разделителю.
'разделитель'.join(list)
Сортировка списков.
list.sort([func])
Сортирует список применяя функцию к соседним элементам.
Если функция возвращает 1, то меняет элементы местами и идет сначала.
lst = [2,4,7,3,9]
def compare(it1,it2):
if it1>it2:
return 1
else:
return -1
lst.sort(compare)
print lst
Compare functions specifies a custom comparison function of two arguments (list items) which should return a negative, zero or positive number.
[('c', 4), ('b', 2), ('a', 3)] => [('c', 4), ('a', 3), ('b', 2)]
lst = [('c', 4), ('b', 2), ('a', 3)]
def letter_cmp(a, b):
if a[1] > b[1]:
return -1
elif a[1] == b[1]:
if a[0] > b[0]:
return 1
else:
return -1
else:
return 1
lst.sort(letter_cmp)
print lst