Файловая система. Строки. Списки.

Основы Python и 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'

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

Основы Python и 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.

Документация по random

Открытие оператором 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)

Работа со строками.

Ссылка на документацию

Строки - это в первую очередь последовательности. Но в отличие от остальных последовательностей они состоят исключительно из символов Unicode.

Если вы определяете строку то ее обязательно необходимо обрамлять кавычками.

Кавычки могут быть одинарными двойными или тройными. Отличаются только тройные тем что сохраняют символы переноса строк. Т.е. если вы используете одинарные или двойные кавычки то перенос строки будет игнориваться при работе со строкой. И при выводе или печати, например, даже если вы вставили переносы строк клавишой Enter то строка все равно выведется в одну строку.

Строковые литералы

Перед строкой может стоять литерал, который указывает на тип данных, из которых состоит строка.

например var = b’hello’ указывает на то, что каждый символ строки закодирован одним байтом.

Если литерал не указан, то в Python 3 за тип данных по умолчанию принимаются символы в кодировке UTF-8. В Python 2 это надо было явно указывать литералом u.

var = u'Привет'

Литерал b указывает на то, что строка состоит из набора байтов (чисел от 0 до 255). В этом диапазоне находядяиься все символы латинского алфавита (кодировка ASCI), цифры и спец-символы (!”№%: и т.д), yj но многие числа этого диапазона не содержат символьной интерпретации. Интерпретация осуществляется функцией chr.

>>> chr(50)
'2'

Например число 119 соответствует символу ‘w’

>>> chr(119)
'w'

Т.к. литерал b говорит об одном байте на символ то невозможно обозначить этим литералом строку, символы которой кодируются более чем одним байтом (например символы кирилицы)

>>> b'Жорик'
File "<stdin>", line 1
    b'Жорик'
    ^^^^
SyntaxError: bytes can only contain ASCII literal characters

Функция bytes

Функция bytes принимает список чисел от 0 до 255 и возвращает байты, получающиеся применением функции chr.

>>> print(bytes([119]))
b'w'
>>> bytes([104, 101, 108, 108, 111])
b'hello'

Bytes возвращает не изменяемый массив но его аналог bytesarray возвратит изменяемый.

Хотя байтовые строки поддерживают практически все строковые методы, с ними мало что нужно делать. Обычно их надо записать в файл / прочесть из файла и преобразовать во что-либо другое. Для преобразования байтов в строку используется метод decode для строки в байты encode.

>>> 'Привет'.encode('utf-8')
b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

>>> b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'.decode('utf-8')
'Привет'

Кодировка utf-8

Использует переменное количество байт от 1 до 4 на один символ. В примере выше каждый символ кодировался двумя байтами.

xd0\x9f - соответствует символу “П”

>>> b'\xd0\x9f'.decode('utf-8')
'П'

Если взять первый байт \xd0 то

\x - говорит о 16-ричной системе исчисления d0 - шеснадцатиричное число (в десятиричной это 208)

ccылка на онлайн конвертер для разрядности чисел

Очевидно что для utf-8 символов, состоящих из 1 байта (октета) кодировка будет соответствовать однобайтовой кодировке ASCII, где, как говорилось, находятся латинские буквы, цифры, знаки припинания и спец. символы.

>>> b's'.decode('ASCII')
's'
>>> b's'.decode('utf-8')
's'

В процессе кодирования в utf-8 вначале вычисляется количество необходимых байт для символа, а затем в них вписывается номер символа согласно универсальной таблице Unicode, которая содержит символы всех языков мира.

Строка Python, которая закодирована в utf-8 содержит абстракцию, которая не зависит от ее отображения. Поэтому ее невозможно передать по сети или записать на диск не преобразовав в бинарный формат. К счастью, эти процессы преобразования во многих стандартных случаях происходят под капотом и редко возникает необходимость в явном их преобразовании.

Длинна

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()

Работа со списками.

Сравнение списка и словаря.

python requests

Ссылка на документацию

Определение списков.

Списки - перечисляемые структуры разных элементов, заключенные в [] и разделенные запятой.

В основном списки используются в циклах.

Создание списков

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
Основы Python и Django. -> Домашнее задание. Списки.

Домашнее задание. Списки.

  1. Используя генератор списков, создать список, заполненый квадратами целых чисел от 1 до 5.

  2. Используя генератор списков, создать список, заполненый 10 случайными числами от 1 до 10, удалить из него повторяющиеся значения.

  3. Считать имена файлов внутри текущего каталога и вывести их на экран в виде списка, отсортированного по алфавиту.

  4. Дана строка ‘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[:]
Основы Python и Django. -> Домашнее задание. Строки.

Домашнее задание.

  1. Перенести все файлы из одной директории в другую.

  2. Прочитать текстовое содержимое из всех файлов каталога и объеденить его в одном файле через разделитель точка с запятой.

  3. Есть текстовый файл вида.

    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’