Быстрый в изучении - мощный в программировании
Скрипт ИНВЕСТОР на Python

Попробуйте себя в качестве инвестора имея в помощники мощный алгоритм советника на Python...

Все уроки по PyQt5

PyQt5 реализован как комплект Python-модулей. Он включает в себя около 620 классов и 6000 функций и методов...

Скрипт отправки SMS через Python

Была задача отправить SMS-ки большому списку номеров телефона с уточнением цены за всю рассылку "До" ее отправки...

Python для начинающих

Подписаться на эту рубрику по RSS

Обучающие статьи программированию на Python. Пишем от простых программ до более сложных и изучаем мощный язык программирования Python.

Парсер HTML Python

В практике любого программиста наступает задача скопировать некий материал с сайта. Так как страниц достаточно много не стоит терять время на ручное копирование. Ведь, языки программирования нужны для того чтобы избавится от рутинной работы и автоматизировать разные задачи. В Python есть отличная библиотека для работы с HTML. С ней можно парсить не только сайты но и обычные html документы. Хорошим преимуществом данной библиотеки является персональный алгоритм структурирования HTML кода, что позволяет программисту сэкономить время работы.

Но, проблемы в работе с html документами могут все равно появляться. HTML не имеет строгую структуру кода и некоторые верстальщики дают волю фантазии и изобретают свою структуру кода. Могут возникнуть и проблемы с кодировкой, что создаст новые проблемы для структурирования кода и получения данных.

Мы не будем воровать контент с других сайтов чтобы продемонстрировать библиотеку в работе, примеры будем делать на нашем сайте. Администрация pythonworld, поблагодарит нас за это и пойдем дальше.

Установка библиотеки Beautiful Soup (Linux)

$ apt-get install python-bs4
$ apt-get install python-lxml
$ apt-get install python-html5lib

Библиотека Beautiful Soup предназначена для работы с Python 2, но так же умеет работать с кодом Python 3. После установки и python-html5lib, можно будет парсить и современные документы стандарта HTML5.

Далее...

циклы в Python

Для организации циклов наиболее часто используется инструкция for, которая позволяет выполнить обход элементов коллекции. Итерации – одна из самых богатых особенностей языка Python. Однако наиболее часто используемой формой итераций является простой цикл по элементам последовательности, такой как строка, список или кортеж. Пример реализации итераций приводится ниже:

# -*- coding: utf-8 -*-
for n in [1,2,3,4,5,6,7,8,9]:
    print "2 в степени %d = %d" % (n, 2**n)

В данном примере на каждой итерации переменная n будет последовательно получать значения из списка [1,2,3,4,...,9]. Поскольку необходимость организовать цикл по фиксированному диапазону целочисленных значений возникает достаточно часто, для этих целей используется сокращенная форма записи:

for n in range(1, 10):
    print "2 в степени %d = %d" % (n, 2**n)

Функция range(i,j [,stride]) создает объект, представляющий диапазон целых чисел со значениями от i по j-1. Если начальное значение не указано, оно берется равным нулю. В третьем необязательном аргументе stride можно передать шаг изменения значений. Например:

Далее...

Словари в Python

Словарь является ассоциативным массивом или таблицей хешей, содержащий объекты, индексированные ключами. Чтобы создать словарь, последовательность элементов необходима заключить в фигурные скобки ({}), как показано в примере ниже.

Для получения значения словаря, его содержимое вызывается с помощью ключа. Ключ должен быть уникальным по отношению к другим, если ключ в словаре дублируется, то значение ключа будет тот кто ближе к концу словаря.

person = {
    'name': 'Ваня',
    'age': 18,
}
Объекты из словарях, можно изменять по своему желанию следующим образом.

person = {
    'name': 'Ваня',
    'age': 18,
}
person['name'] = 'John'
print person # Вернет: {'age': 18, 'name': 'John'}
Чаще всего в качестве ключей применяются строки, тем не менее, для этих целей допускается использовать большинство других объектов языка Python, включая числа и кортежи. Определенные объекты, включая списки и словари, не могут использоваться в качестве ключей, потому что их содержимое может изменяться.

Далее...

Создание функции Python

Функции являются отличным помощником во всех языках программирования. Они способствуют улучшению кода за счет выполнения ими повторных задании без нужны дублировать код для получения результата без использования функции. Код функции должен быть как можно более компактнее. Функция должна выполнять только одну операцию. Она должна выполнять ее хорошо и ничего другого она делать не должна. Чтобы создать читабельный код для вам и для других программистов вы должны следить за ним. Вы работаете с с чистым кодом, если каждая функция в основном делает то, что вы от нее ожидали. Половина усилий по реализации этого принципа сводится к выбору хороших имен для компактных функции, выполняющих одну операцию.

Чем меньше и специализированнее код функции, тем проще выбрать для нее понятное имя. Не бойтесь использовать длинные имена. Длинное содержательное имя лучше короткого невразумительного. Будьте последовательны в выборе имени. Используйте в имени функции те же словосочетания, глаголы и существительные, которые используются в ваших модулях. Создание функции производится с помощью инструкции def, как показано в следующем примере. Мы уже научились работать со списками в python, давайте воспользуется знаниями тут.

# -*- coding: utf-8 -*-
Phones = ['Nokia', 'Samsung', 'LG', 'Sony']
def show_as_text(user_list):
    words = ''
    for value in user_list:
        words += str(value) + ' '
    return words
print 'Phones: ', show_as_text(Phones) # Вернет: Phones:  Nokia Samsung LG Sony
Далее...

списки в python

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

# -*- coding: utf-8 -*-
cars = ['BMW', 'Mercedes', 'Ford']
print (cars[0]) # Выведет первый элемент списка BMW
print (cars[2]) # Последний элемент списка Ford

Довольно простые примеры. Попробуем добавить в конце списка новый элемент Audi. Для добавления новых элементов в конце списка используется метод append().

cars.append('Audi')
print (cars) # Получим: ['BMW', 'Mercedes', 'Ford', 'Audi']

Для добавления нового элемента по середине или перед любым другим элементом используется метод insert(order_num, value)

cars.insert(2, 'Mitsubishi')
print (cars) # Получили: ['BMW', 'Mercedes', 'Mitsubishi', 'Ford', 'Audi']

Воспользуемся оператором среза чтобы извлекать и изменять целые фрагменты списков.

cars = ['BMW', 'Mercedes', 'Mitsubishi', 'Ford', 'Audi']
first_two = cars[0:2]       # Первые два элементы списка, вернет: ['BMW', 'Mercedes']
another_cars = cars[3:]     # Все элементы в списке после 3-го включая его. Вернет: ['Ford', 'Audi']
cars[1] = 'Mercedes-Benz'   # Заменяет значение второго элемента на новое
print (cars)                # Получим: ['BMW', 'Mercedes-Benz', 'Mitsubishi', 'Ford', 'Audi']
Далее...

Чтение из файла на Python

Создавая логирование действии, сохраняя из интернета изображения, читая построчно из файла и многие другие действия которые требуют от нас запись, сохранения и чтение, в Python выполняется весьма просто и быстро. В случае сохранения данных в файл, папка в которой находится файл должна иметь права 777. Следующая программа открывает файл и читает его содержимое построчно:

# -*- coding: utf-8 -*-
f = open('power.txt')
line = f.readline()
while line:
    print (line),
    line = f.readline()
f.close()

Функция open() возвращает новый файловой объект. Вызывая методы этого объекта можно выполнять разные действия над файлом, такие как чтение и запись. Метод readline() который мы использовали в примере выше, читает одну строку из файла, завершая символом перевода строки. Используя данный метод, для чтения файла нам понадобится цикл while, и в теле цикла вызывать readline() чтобы читать следующею строку. После чтения всего файла, метод возвращает пустую строку т.е. False, вот тогда цикл while и завершает свою работу.

Можно читать из файла построчно не используя при этом цикл while, данный способ более прост и читабельней.

# -*- coding: utf-8 -*-
f = open('power.txt')
for line in f.readlines():
    print (line),
Метод readlines() отличается одной добавленной буквой и строит обратить внимание на это, часто ошибаются и используют readline() и не понимают почему выдают всего лишь одну строку. readline() и readlines() выполняют одну и ту же операцию - читаю построчно данные из файла, но возвращают разные данные. readlines() возвращает список в котором содержится строки из файла.

Далее...

Python SMTPlib

Недавно пришлось написать небольшой скрипт для рассылки писем к читателям с одного проекта. На PHP у меня уже ранее реализован данный скрипт, но т.к. я перешел программировать на Python мне нужно больше практики для понимания языка. Хочу сказать, что по сравнению с PHP, собственная smtp библиотека от Python гораздо удобнее для настройки в случае если нам нужна аутентификация с другого почтового сервиса.

Плюсы и минусы

Написал небольшую функцию которая должна отвечать всем вашим требованиям. Некоторые моменты с которыми были бы костыли в PHP, в Python реализованы весьма логично. Например отправлять массовое сообщение на PHP, пришлось создавать цикл и каждому получателю отправлять отдельное письмо через вызов mail(). Python нам сразу предлагает указать все нужные адресаты в общий список и передать ему - он сам разберется.

В PHP мне иногда приходилось мучится с кодировкой. Когда проверяешь и видишь, что все в порядке с кодировкой но письмо опять с иероглифами, это очень сильно бесит. Несмотря на то, что в Python, модуль smtplib принимает текст письма исключительно в ASCII, проблема с русским языков исчезает сразу если указать кодировку в самом скрипте т.е.

Далее...

Копирование файлов в Python

Перемещать и копировать файлы по каталогам нам поможет функции модуля shutil. Подключаем модуль shutil в начале нашего скрипта на Python, потом уже получим доступ к его функциям. Функции модуля shutil не ограничиваются только на копирование и перемещение, мы обсудим разные методики использования функции даного модуля.

Функция copyfile(Копируемый файл, путь куда копируем)

Копирует содержимое файла по указанному пути и создает новый в указанном во втором параметре месте. Методанные при этом не копируются т.е. права доступа и т.д. Если место куда мы копируем уже имеет такой файл он будет перезаписан. В случае неудачи копирования, возбуждается исключение IOError.

>>> import shutil # Подключаем модуль
>>> shutil.copyfile(r'/home/py/mouse.txt', r'/home/py/new-mouse.txt')
>>> # Указанный путь не будет существовать
>>> shutil.copyfile(r'/home/py/mouse.txt', r'/go/here/no.txt')
IOError: [Errno: 2] No such file or directory
'/go/here/no.txt'

Функция copy(Копируемый файл, куда копируем)

Копирует файл вместе с его правами. В случае если файл уже существовал, он будет перезаписан. Неудачное копирование вызовет исключение IOError.

shutil.copy(r'my_file.txt', r'new_file.txt')
Далее...

Python работа с FTP - Модуль ftplib

Клиентская часть в Python реализуется при помощи модуля ftplib. Использовать непосредственно данный модуль на практике приходится не так часто, в связи с тем, что есть другой модуль urllib, имеющий более высокоуровневый интерфейс. Модуль ftplib может пригодится когда в вашей программе необходим более обширный контроль над низкоуровневыми FTP соединениями. Для более понятной работы с модулем ftplib советуем поближе изучить протокол FTP.

Модуль определяет единственный класс, используемый для создания FTP-соединения:

con = FTP(хост, ftp-пользователь, пароль пользователя, учетная запись, время ожидания)

После вызова класса FTP, создается объект представляющий FTP-соединение. Первый аргумент хост является обязательным в нем передается имя хоста, это может быть IP или название домена. Остальные параметры являются необязательными, если хост не требует введение аутентификационных данных.

Вызывая класс без аргументов, чтобы установить соединение, потребуется вызвать метод connect() и login(). При указании лишь аргумента хост, метод connect() будет вызываться автоматически в конструкторе. Тот же случай при указании данных пользователя сразу при вызове класса FTP, метод login() будет вызван автоматически. Последний аргумент "время ожидания" указывается в секундах, если по истечению данного срока соединение не будет установлено класс закончит работу.

Методы класса FTP

con.abort()

Отправляет запрос для прерывания попытки продолжающуюся передачу файлов. В зависимости от настроек и особенностей удаленного сервера, результат данного метода может не дать нужного результата

con.close()

Закрывает FTP-соединение. После выполнения данного метода, никакие операции больше не могут выполнятся в сторону объекта con.

con.connect(хост, порт, время ожидания)

Открывает новое FTP соединение для указанного хоста, подключаясь к указанному порту (обычно это порт 21 или в случае SFTP 22). Если данные подключения уже ранее передавались конструктору FTP, нет необходимости вызывать метод con.connect()

con.cwd(путь к папке)

Выполняет переход по указанному пути тем самым изменяя текущий рабочий каталог.

con.delete(путь до файла)

Удаляет указанный файл с сервера.

Далее...