Архив метки: GPS

Сериал "Python PDF" – Обзор metaPDF (Перевод)

Исследуя библиотеки для работы с PDF на Python, я наткнулся на ещё один маленький проект с названием metaPDF. Судя по указанному на сайте этого проекта, metaPDF это лёгкая библиотека для Python, оптимизированная для получения и вставки метаданных, по сути это легковесная обёртка вокруг замечательной библиотеки pyPdf. Я не уверен в том, что эта библиотека будет полена с учётом возможности работы с самой библиотекой pyPdf, так что давайте посмотрим на неё в деле.

Получение и использование metaPDF

Процесс установки metaPDF достаточно прост, особенно если использовать easy_install или pip. После этого давайте запустим маленький скрипт для того, чтобы посмотреть, как он работает. Вот пример, основанный на информации с github:
from metapdf import MetaPdfReader
 
pdfOne = r'C:UsersmdriscollDocumentsreportlab-userguide.pdf'
x = MetaPdfReader()
metadata = x.read_metadata(open(pdfOne, 'rb'))
print metadata
Я запускаю скрипт к руководству по Reportlab. Обратите внимание, что в оригинале есть опечатка — там используется “read” для открытия файла. Я полагаю, что он не будет работать, пока Вы сам не откроете файл. В любом случае, вот результат работы этого скрипта:
{'/ModDate': u'D:20120629155504', '/CreationDate': u'D:20120629155504', '/Producer': u'GPL Ghostscript 8.15', '/Title': u'reportlab-userguide.pdf', '/Creator': u'Adobe Acrobat 10.1.3', '/Author': u'mdriscoll'}
Я правда не знаю, каким образом изменилось поле «автор» в документе, но я определённо им не являюсь. Так же я не понимаю, откуда в названии ключей берутся прямые слешы. Судя по исходникам, это всё, что может делать эта библиотека. Разочарованы?  Может быть, если мы проявим внимание к этой библиотеке, автор добавит ей функциональности…

Автор: Ishayahu Lastov

Python 101: Загрузка файла при помощи ftplib (Пароль)

Есть несколько способов загрузки файла из интернета при помощи Python. Одним из самых популярных способов является подключение к FTP серверу и скачивание файла. Этим мы и сейчас займёмся. Всё, что нам понадобится — стандартная установка Python. В неё включена библиотека ftplib, которой нам вполне хватит.

Скачиваем!

Скачать файл очень просто:
# ftp-ex.py
 
import os
from ftplib import FTP
 
ftp = FTP("www.myWebsite.com", "USERNAME", "PASSWORD")
ftp.login()
ftp.retrlines("LIST")
 
ftp.cwd("folderOne")
ftp.cwd("subFolder") # или ftp.cwd("folderOne/subFolder")
 
listing = []
ftp.retrlines("LIST", listing.append)
words = listing[0].split(None, 8)
filename = words[-1].lstrip()
 
# скачиваем файл
local_filename = os.path.join(r"c:myfolder", filename)
lf = open(local_filename, "wb")
ftp.retrbinary("RETR " + filename, lf.write, 8*1024)
lf.close()
Давайте разбираться. Во-первых, нам надо подключиться к FTP серверу, так что необходимо передать URL сервера, логин и пароль. Если же Вы используете анонимный FTP сервер — то последние два аргумента можно опустить. Команда retrlines(“LIST”) выдаёт листинг папки. Команда cwd изменяет рабочую папку (“change working directory”), которую Вы используете для перехода в нужную для Вас папку. В следующей части показано как достаточно глупым способом получить имя файла. Вы можете использовать os.path.basename для тех же целей. Последняя часть показывает, собственно, как скачать файл. Обратите внимание, что файл открывается в режиме “wb” (двоичная запись). “8*1024″ — размер блоков для загрузки, хотя Python достаточно умён, чтобы выбрать подходящий размер.

Обратите внимание: Эта статья основана на документации Python для модуля ftplib и этот скрипт можно найти в папке с установленным Python: Tools/scripts/ftpmirror.py.

Домашнее чтение

Автор: Ishayahu Lastov

Знакомимся с virtualenv (Перевод)

Виртуальное окружение может быть очень полезно для тестирования программ. Ian Bicking создал проект  virtualenv, который и является инструментом для создания изолированного окружения Python. Вы можете использовать эти окружения для проверки новых версий ваших программ, новых версий пакетов, которые Вы используете или просто в качестве песочницы для новых пакетов. Кроме того, Вы можете использовать virtualenv в качестве рабочего места в случаях, если Вы не можете копировать файлы в site-packages по какой-либо причине. Когда Вы создаёте виртуальное окружение при помощи virtualenv, он создаёт папку и копирует Python в неё с папкой site-packages и несколькими другими. Кроме того устанавливается pip. Пока активно ваше виртуальное окружение оно используется как обычный Python. Когда же Вам оно перестаёт быть нужным — Вы просто удаляете папку. И всё. Или можете продолжать её использовать для работы.
В этой статье мы потратим немного времени для знакомства с virtualenv.

Установка

Для начала понадобится установить virtualenv. Вы можете использовать для этого pip или easy_install или просто загрузить файл virtualenv.py с их сайта и просто использовать его. На данный момент предположим, что ваша папка Python находится в системном пути поиска и Вы можете использовать  virtualenv в командной строке.

Создаём виртуальное окружение

Для создания песочницы выполните следующую команду:

python virtualenv.py FOLDER_NAME
Где FOLDER_NAME — это имя папки, которую Вы будете использовать в качестве песочницы. На моём компьютере Windows 7, я добавил папку C:Python26Scripts в путь поиска так что я могу использовать команду virtualenv.py FOLDER_NAME без слова python. Если Вы не укажете имя папки, то получите в ответ список опций, которые можно передать скрипту. Давайте создадим проект с названием sandbox. Как его использовать? Для начала надо его активировать:
На POSIX системах Вам нужно source bin/activate тогда как на Windows Вам нужна команда путь_к_песочницеScriptsactivate. Давайте пройдём через эти шаги. Песочницу создадим на рабочем столе:

C:UsersmdriscollDesktop>virtualenv sandbox
New python executable in sandboxScriptspython.exe
Installing setuptools................done.
Installing pip...................done.

C:UsersmdriscollDesktop>sandboxScriptsactivate
(sandbox) C:UsersmdriscollDesktop>

Вы можете заметить что как только Вы активировали ваше виртуальное окружение, Вы увидите в приглашении командной строки префикс с названием папки для вашей песочницы (в нашем случае — “sandbox”). Так Вы можете определить, используется ли песочница или нет. После этого Вы можете использовать pip для установки пакетов в ваше виртуальное окружение. Когда закончите работать просто вызовите команду декативации для того, чтобы выйти из виртуального окружения.
Есть несколько флагов, которые Вы можете передать скрипту virtualenv при создании виртуального окружения. Например, можно использовать –system-site-packages для переноса пакетов из установки Python. Если Вы хотите использовать distribute вместо setuptools, можете использовать флаг –distribute.
virtualenv так же предоставляет способ просто установить библиотеки, но использовать их при помощи стандартного Python. Согласно документации, для этого Вам надо лишь написать специальный скрипт. Подробнее смотрите тут.
Кроме того, есть экспериментальный флаг –relocatable который можно использовать для того, чтобы сделать папку переместимой. Однако, на данный момент, это не работает на Windows.
Наконец, есть флаг –extra-search-dir, который можно использовать, чтобы сохранить ваше виртуальное окружение оффлайн. Это позволяет Вам добавить папку в путь поиска, по которому pip или easy_install будет искать пакеты для установки, даже если у Вас нет доступа к интернету.

Итог

К этому времени Вы должны уметь сами использовать virtualenv. Есть несколько других проектов, которые теперь могут Вам пригодиться. Есть библиотека Doug Hellman’а virtualenvwrapper, которая облегчает создание, удаление и управление виртуальных окружений. Есть zc.buildout, который похож на virtualenv и является его конкурентом. Я рекомендую посмотреть их и изучить — они могут помочь Вам в вашей работе.

Автор: Ishayahu Lastov

Python 101: pip –замена для easy_install (Перевод)

Pip Installs Python или pip — это инструмент для установки и управления пакетами Python, многие из которых расположены на Python Package Index (PyPI). Он является альтернативой easy_install. В этой статье мы потратим немного времени на то, чтобы посмотреть, как он работает и как он может помочь нам в нашей работе с Python.

Установка

Для работы Вам потребуется distribute или setuptools. Если Вы работаете с Python 3, тогда ваш единственный выбор — distribute, так как setuptools на данный момент ещё не портирован на эту версию. На сайте  pip есть установщик, так то вы можете использовать get-pip.py или просто перейти на PyPI и скачать исходники.
Как Вы уже знаете, для установки большинства модулей из исходников необходимо распаковать полученный архив, перейти в его папку и запустить в ней команду “python setup.py install”. Обратите внимание, что для установки могут понадобиться права администратора. На сайте pip рекомендуется использовать pip в virtualenv, поскольку в таком случае он устанавливается автоматически, “не требует прав администратора и не изменяет вашу установку Python”. Но это на ваш выбор.

использование pip

Чаще всего pip используют для установки, обновления или удаления пакетов. Все эти процедуры описаны на официальном сайте, но мы по ним всё равно пройдёмся. Так как мы упомянули про virtualenv, давайте и установим его при помощи pip:

pip install virtualenv
Если Вы запустите эту команду в терминале, Вы увидите что-то вроде этого:

Downloading/unpacking virtualenv
Downloading virtualenv-1.7.2.tar.gz (2.2Mb): 2.2Mb downloaded
Running setup.py egg_info for package virtualenv
warning: no previously-included files matching '*' found under directory 'do
cs_templates'
warning: no previously-included files matching '*' found under directory 'do
cs_build'
Installing collected packages: virtualenv
Running setup.py install for virtualenv
warning: no previously-included files matching '*' found under directory 'do
cs_templates'
warning: no previously-included files matching '*' found under directory 'do
cs_build'
Installing virtualenv-script.py script to C:Python26Scripts
Installing virtualenv.exe script to C:Python26Scripts
Installing virtualenv.exe.manifest script to C:Python26Scripts
Installing virtualenv-2.6-script.py script to C:Python26Scripts
Installing virtualenv-2.6.exe script to C:Python26Scripts
Installing virtualenv-2.6.exe.manifest script to C:Python26Scripts
Successfully installed virtualenv
Cleaning up...
Похоже, что работает. Обратите внимание, что pip загружает пакет ДО начала установки, чего не делает easy_install (за другими отличиями обраща

Python 201: Введение в distutils (Перевод)

В прошлый раз мы узнали как создавать модули и пакеты. Сегодня мы возьмём этот пакет и посмотрим, как при помощи distutils мы можем сделать этот пакет доступным для других людей. Мы научимся: 
  • создавать файл setup.py
  • создавать source distribution
  • создавать установщик для Windows

Начнём!

Пишем наш первый скрипт “setup.py”

Когда вы пишете ваш скрипт setup.py, Вы должны держать в голове его расположение. Если он будет находиться в папке с вашим пакетом, то это приведёт к ошибке при попытке им воспользоваться. Если он будет расположен где-то далеко, то скорее всего Вы при установке добавите ещё и те файлы, которые бы распространять не хотели. Поэтому для простоты мы создадим новую папку, куда и скопируем созданную вчера папку “mymath”. И тут же сохраним наш setup.py. Структура новой папки будет выглядеть так:
myNewFolder/
mymath/
setup.py
Внимание: Если у Вас нет кода, созданного в прошлой статье, его можно скачать тут

Теперь неплохо бы этот файл наполнить кодом:

from distutils.core import setup
 
setup(name = "mymath",
version = "0.1",
description = "A Simple Math Package",
author = "Mike Driscoll",
author_email = "mike@somedomain.com",
url = "http://www.blog.pythonlibrary.org/2012/07/08/python-201-creating-modules-and-packages/",
packages=["mymath"]
)
Что же, выглядит не плохо. Если мы хотим добавить в наш setup.py ещё какие-то пакеты, то мы просто перечисляем их в списке packages. Кроме того есть список py_modules, куда можно добавить отдельные модули. Если Вы будете рыться в документации, то Вы обнаружите, что Вы можете добавлять даже файлы, не являющиеся скриптами Python используя класс Extension библиотеки distutils. Например, это может понадобиться для добавления файлов С или чего-то в этом роде, что можно встретить в сторонних пакетах, вроде lxml.

Distutils: Как распространять исходники и установщики для Windows

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

python setup.py sdist

Вы увидите что-то вроде этого:

C:UsersmdriscollDocumentsmymath-setup>python setup.py sdist
running sdist
warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list)
writing manifest file 'MANIFEST'
creating mymath-0.1
creating mymath-0.1mymath
copying files to mymath-0.1…
copying README.txt -> mymath-0.1
copying setup.py -> mymath-0.1
copying mymath__init__.py -> mymath-0.1mymath
copying mymathadd.py -> mymath-0.1mymath
copying myma
thdivide.py -> mymath-0.1mymath

copying mymathmultiply.py -> mymath-0.1mymath
copying mymathsubtract.py -> mymath-0.1mymath
creating dist
creating 'distmymath-0.1.zip' and adding 'mymath-0.1' to it
adding 'mymath-0.1PKG-INFO'
adding 'mymath-0.1README.txt'
adding 'mymath-0.1setup.py'
adding 'mymath-0.1mymathadd.py'
adding 'mymath-0.1mymathdivide.py'
adding 'mymath-0.1mymathmultiply.py'
adding 'mymath-0.1mymathsubtract.py'
adding 'mymath-0.1mymath__init__.py'
creating 'distmymath-0.1.zip' and adding 'mymath-0.1' to it
adding 'mymath-0.1PKG-INFO'
adding 'mymath-0.1README.txt'
adding 'mymath-0.1setup.py'
adding 'mymath-0.1mymathadd.py'
adding 'mymath-0.1mymathdivide.py'
adding 'mymath-0.1mymathmultiply.py'
adding 'mymath-0.1mymathsubtract.py'
adding 'mymath-0.1mymath__init__.py'
removing 'mymath-0.1' (and everything under it)

Что бы всё это могло значить? Только то, что distutils создал новую папку, названную dist, в которой теперь находится zip файл (mymath-0.1.zip) со всеми файлами вашего пакета. Если же Вы работаете на *nix — то получите tarball.
Далее, если Вы хотите создать установщик под Windows — это тоже будет легко сделать. Вам для этого понадобится такая команда:
python setup.py bdist_wininst

Эта  команда создаст папку build (на которую Вы можете не обращать внимание) и файл с названием mymath-0.1.win32.exe в вашей папке dist, который Вы можете запустить под Windows для установки вашего пакета. Так давайте попробуем!

Как установить ваш пакет?

В случае исходников, Вам надо их распаковать / разархивировать и затем выполнить следующую команду:
python setup.py install

Если всё было сделано верно и всё работает верно, то пакет будет установлен в вашей системе (для той версии python, которую Вы используете для запуска этой команды — прим. пер.). Если Вы запустите установщик Windows, то возникнет такой мастер установки:

Обратите внимание, что тут показаны все метаданные, которые мы указывали в нашем скрипте setup.py. Круто, правда? В любом случае, если Вы выполните все шаги мастера — Вы опять же установите пакет на свою систему.
Внимание: при такой установке пакет будет установлен в вашу основную версию Python. Если Вы не хотите этого — используйте virtualenv.

Итоги

Теперь Вы должны уметь создавать установщики и устанавливать свои пакеты при помощи distutils. Если Вы хотите загрузить ваш пакет в Python Packages Index (PyPI) — смотрите руководство. Удачи и кодируйте удовольствие!

Чтение на будущее

Источник

Автор: Ishayahu Lastov

Введение в pyfpdf – Простая библиотека для создания PDF на Python (Перевод)

Сегодня мы посмотрим на простую библиотеку для создания PDF, которая называется pyfpdf и является портом библиотеки FPDF для PHP. Она не может заменить Reportlab, но даёт Вам более чем простую возможность создавать PDF файлы. Давайте на неё посмотрим.

Установка pyfpdf

К сожалению, у этого пакета не setup.py или eggs, что облегчило бы нам его установку. Вместо этого Вам придётся скачать его, разархивировать и скопировать получившуюся папку в папку site-packages. Последняя версия создаёт папку pyfpdf-1.54b, так что Вам придётся переименовать её в pyfpdf, если Вы хотите использовать примеры из их руководства или из этой статьи. Кроме того, Вы можете просто скопировать его в virtualenv.

Тест-драйв pyfpdf

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

import pyfpdf
 
pdf = pyfpdf.FPDF(format='letter')
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="Welcome to Python!", align="C")
pdf.output("tutorial.pdf")
Обратите внимание, что когда Вы инициализируете ваш FPDF объект, Вы должны сообщить ему, что хотите, чтобы результат был с размером «letter». По умолчанию его значение «A4». Далее мы должны добавить страницу, задать шрифт и поместить туда какой-нибудь текст. Вызов pdf.cell немного не очевиден. Первые два аргумента — ширина и высота и определяет место, где будет располагаться ваш текст. Параметр align принимает в качестве значения один символ. В нашем случае мы центрируем текст, передавая символ «С». Последняя строка принимает два параметра — имя файла и путь. Если путь не задан, то файл будет располагаться в рабочей папке скрипта.
А что, если мы хотим добавить ещё одну строку? Это можно сделать, добавляя текст в конец файла, добавив ещё одну «ячейку». Если Вам нужен разрыв строки — можно использовать такой код:
import pyfpdf
 
pdf = pyfpdf.FPDF(format='letter')
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="Welcome to Python!", ln=1, align="C")
pdf.cell(200,10,'Powered by FPDF',0,1,'C')
pdf.output("tutorial.pdf")

Добавляем Цацки: заголовки, нижние колонтитулы и разрывы страниц

В руководстве показано, как можно добавить заголовок, нижний колонтитул и разрыв страниц. Но этот способ не работает, так как надо изменить имя метода и код надо переписать, используя this вместо self (не знаю о чём он — прим. пер.). Вот что должно быть в идеале:

import pyfpdf
 
########################################################################
class MyPDF(pyfpdf.FPDF):
""""""
 
#----------------------------------------------------------------------
def header(self):
"""
Заголовок на каждой странице
"
""
# добавляем логотип
self.image("logo.png", x=10, y=8, w=23)
# располагаем логотип справа
self.cell(w=80)
 
# устанавливаем шрифт для заголовка, B=Bold
self.set_font("Arial", style="B", size=15)
# заголовок страницы
self.cell(40,10, "Python Rules!", border=1, ln=0, align="C")
# вставляем разрыв строки в 20 pixels
self.ln(20)
 
#----------------------------------------------------------------------
def footer(self):
"""
Нижний колонтитул на каждой странице
"
""
# располагаем footer в 15mm от конца страницы
self.set_y(-15)
 
# устанавливаем шрифт, I=italic
self.set_font("Arial", style="I", size=8)
 
# отображаем номер страницы по центру
pageNum =
"Page %s/{nb}" % self.page_no()
self.cell(0, 10, pageNum, align="C")
 
#----------------------------------------------------------------------
if __name__ == "__main__":
pdf = MyPDF
()
pdf.
alias_nb_pages()
pdf.
add_page()
pdf.
set_font("Times", size=12)
 
# добавляем несколько строк на страницу
for i in range(1, 50):
pdf.
cell(0, 10, "Line number %s" % i, border=0, ln=1)
pdf.
output("tutorial2.pdf")
Итак, мы создали подкласс FPDF, переопределили его методы header и footer, так как в оригинальном классе они всего лишь заглушки. В нашем заголовке мы создаём объект изображения и задаём его координаты х/у и его ширину w. Кроме того, вы можете передать и его высоту, если Вас беспокоит соотношение сторон. После этого мы его позиционируем и добавляем строку текста для заголовка. Наконец, мы добавляем разрыв строки.
Footer мы помещаем на 15 мм выше конца страницы. Его шрифт — 8pt Arial Italic. Ошибка в официальном руководстве была в том, что он вызывал self.PageNo(), который не существует. Зато есть метод page_no, который, видимо, его заменяет, так что я его и испо
льзовал. Наконец, в конце скрипта мы создаём наш PDF объект и записываем в него несколько строк. Если Вы запустите этот скрипт, Вы получите 3-х страничный документ.

Подведение итогов

В руководстве говорится так же об использовании цветов, но это я оставлю Вам в качестве домашнего задания. Ничего по поводу рисования, вставки таблиц или графиков, встраивания собственных шрифтов и многих других вещей, доступных в Reportlab, я не нашёл, но, опять же, это и предполагалось в качестве простой библиотеки для создания PDF. Если Вам нужны более продвинутые инструменты — смотрите в сторону Reportlab или проектов, созданных на его основе (rst2pds или xhtml2pdf).

Домашнее чтение

Автор: Ishayahu Lastov