Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

[ Россум, Дрейк, Откидач ] Язык программирования Python

.pdf
Скачиваний:
300
Добавлен:
25.04.2014
Размер:
1.5 Mб
Скачать

23.3. bsddb — интерфейс к библиотеке баз данных BSD

331

’n’

Создать новую пустую базу данных (старый файл перезаписывается) и открыть ее для чтения и записи.

На платформах, поддерживающих блокировку, к флагу может быть добавлен символ ‘l’, если блокировка должна быть использована.

Остальные аргументы используются достаточно редко, Вы можете узнать об их назначении из документации к функции dbopen() библиотеки BSD db.

hashopen(filename [, flag [, mode [, bsize [, ffactor [, nelem [, cachesize [, hash [, lorder]]]]]]]])

Открывает файл базы данных в формате “Hash” и возвращает соответствующий ему объект.

btopen(filename [, flag [, mode [, btflags [, cachesize

[, maxkeypage [, minkeypage [, psize [, lorder]]]]]]]])

Открывает файл базы данных в формате “BTree” и возвращает соответствующий ему объект.

rnopen(filename [, flag [, mode [, rnflags [, cachesize

[, psize [, lorder [, reclen [, bval [, bfname]]]]]]]]])

Открывает файл базы данных в формате “Record” и возвращает соответствующий ему объект.

error

Класс исключений, которые генерируются в случае возникновения различных ошибок, характерных для этого модуля. Заметим, что если в базе данных отсутствует запись с определенным ключом, генерируется исключение KeyError.

Объекты, возвращаемые функциями hashopen(), btopen() и rnopen(), поддерживают большинство операций, характерных для отображений: извлечение, установка и удаление значений по ключу, а также методы has_key() и keys() (ключи и значения должны быть обычными строками). Кроме того, доступны следующие методы:

close()

Закрывает файл с базой данных.

set_location(key)

Устанавливает указатель на запись с ключом key и возвращает кортеж, содержащий ключ и значение для этой записи. Этот метод не может быть применен к объектам, созданным с помощью функции hashopen().

first()

Возвращает кортеж с ключом и значением первой записи в базе данных. Если база данных не содержит ни одной записи, генерируется исключение KeyError. Используя методы first() и next() Вы можете обойти все записи в базе данных.

332

Глава 23. Работа с базами данных

next()

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

k, v = db.first() try:

print k, v

k, v = db.next() except KeyError:

pass

last()

Возвращает кортеж с ключом и значением последней записи в базе данных. Если база данных не содержит ни одной записи, генерируется исключение KeyError. Используя методы last() и previous() Вы можете обойти все записи в базе данных в обратном порядке. Этот метод не может быть применен к объектам, созданным с помощью функции hashopen().

previous()

Возвращает кортеж с ключом и значением предыдущей записи. Этот метод не может быть применен к объектам, созданным с помощью функции hashopen().

sync()

Сбрасывает на диск все не записанные данные.

Пример:

>>>import bsddb

>>>db = bsddb.btopen(’/tmp/spam.db’, ’c’)

>>>for i in xrange(10): db[’%d’ % i] = ’%d’ % (i*i)

...

>>>db[’3’]

’9’

>>> db.keys()

[’0’, ’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’, ’9’]

>>>db.first() (’0’, ’0’)

>>>db.next() (’1’, ’1’)

>>>db.last() (’9’, ’81’)

>>>db.set_location(’2’) (’2’, ’4’)

>>>db.previous()

(’1’, ’1’)

>>> db.sync() 0

333

Глава 24

Сжатие данных

zlib Интерфейс низкого уровня к операциям сжатия, с использованием алгоритма, совместимого с gzip.

gzip Работа с файлами, сжатыми программой gzip.

zipfile Чтение и запись zip-архивов.

24.1zlib — алгоритм сжатия, совместимый с gzip

Функции, определенные в этом модуле, позволяют упаковывать (сжимать) и распаковывать данные с помощью библиотеки zlib (http://www.info-zip.org/pub/infozip/zlib/, RFC 1950). Версия используемой библиотеки zlib языка C определена в виде константы:

ZLIB_VERSION

Строка с версией библиотеки.

Аргумент level в описанных ниже функциях должен быть равным

Z_DEFAULT_COMPRESSION, 0 (Z_NO_COMPRESSION) или целым числом от 1 (Z_BEST_SPEED) до 9 (Z_BEST_COMPRESSION) и определяет уровень сжатия:

Z_NO_COMPRESSION

Сохранить данные без сжатия.

Z_BEST_SPEED

Обеспечивает максимальную скорость при меньшем сжатии.

Z_BEST_COMPRESSION

Обеспечивает наилучшее сжатие с меньшей скоростью.

Z_DEFAULT_COMPRESSION

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

Аргумент wbits (в текущей версии может быть целым числом от 8 до 15) определяет размер окна буфера истории равным 2**wbits. Большее значение обеспечивает

334

Глава 24. Сжатие данных

лучшее сжатие при больших затратах памяти. При использовании отрицательных значений подавляется стандартный заголовок (эта недокументированная возможность позволяет использовать модуль zlib для работы с zip-файлами). Использование значения отличного от MAX_WBITS при распаковке может привести к возникновению ошибки. По умолчанию всегда используется значение MAX_WBITS.

Текущая версия библиотеки позволяет использовать единственный метод (аргумент method) сжатия:

Z_DEFLATED

Метод DEFLATE (см. RFC 1951).

Модуль определяет следующие исключение и функции:

error

Исключения этого класса генерируются в случае возникновения ошибок при упаковке или распаковке.

adler32(string [, value])

Вычисляет контрольную сумму Adler-32 строки string. Контрольная сумма, вычисленная по этому алгоритму практически настолько же надежна, как и CRC32, но вычисляется гораздо быстрее. Если задано число value, оно используется в качестве начального значения контрольной суммы, в противном случае используется фиксированное значение по умолчанию. Это позволяет вычислять контрольную сумму длинного потока по частям. Алгоритм Adler-32 недостаточно сильный, чтобы использовать его в криптографических целях.

compress(string [, level])

Возвращает строку, полученную в результате упаковки строки string.

compressobj([level [, method [, wbits [, mem_level [, strategy]]]]])

Возвращает объект, реализующий упаковку потока данных. Аргумент mem_level определяет использование памяти: 1 — использовать минимум памяти, но что сильно замедляет процесс, 9 — использовать максимум памяти, что дает максимальную скорость. По умолчанию используется DEF_MEM_LEVEL (8). Аргумент strategy может иметь значение Z_DEFAULT_STRATEGY, Z_FILTERED или

Z_HUFFMAN_ONLY и определяет стратегию сжатия (см. документацию к библиотеке zlib языка C).

crc32(string [, value])

Вычисляет контрольную сумму CRC32 (Cyclic Redundancy Check) строки string. Если задано число value, оно используется в качестве начального значения контрольной суммы, в противном случае используется фиксированное значение по умолчанию. Это позволяет вычислять контрольную сумму длинного потока по частям. Алгоритм CRC32 недостаточно сильный, чтобы использовать его в криптографических целях.

24.1. zlib — алгоритм сжатия, совместимый с gzip

335

decompress(string [, wbits [, bufsize]])

Возвращает строку, полученную в результате распаковки строки string. Аргумент bufsize определяет начальный размер буфера вывода (при необходимости буфер будет увеличен).

decompressobj([wbits])

Возвращает объект, реализующий распаковку потока данных. Аргумент wbits имеет такое же значение, как и для функции decompress().

Объекты, реализующие упаковку потока данных, имеют следующие методы:

compress(string)

Упаковывает строку string и возвращает строку с упакованными данными как минимум для части строки string. Часть данных может быть оставлена во внутреннем буфере для дальнейшей обработки. Возвращаемая строка должна быть добавлена к строкам, полученным в результате предыдущих вызовов метода.

flush([mode])

Обрабатывает содержимое внутреннего буфера и возвращает строку с упакованным остатком данных.

В качестве аргумента mode метода flush() может быть использована одна из следующих констант:

Z_SYNC_FLUSH

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

Z_FULL_FLUSH

Аналогично Z_SYNC_FLUSH, но также сбрасывает состояние. Распаковка может быть перезапущена с этого уровня, если предыдущие сжатые данные оказались поврежденными или необходим произвольный доступ к сжатым данным.

Z_FINISH

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

Объекты, реализующие распаковку потока данных, имеют следующие атрибут данных и методы:

unused_data

Строка с неиспользованными данными. Должна быть пустой, если объекту была передана вся строка с упакованными данными.

decompress(string)

Распаковывает строку string и возвращает строку с распакованными данными как минимум для части строки string. Часть данных может быть оставлена во внутреннем буфере для дальнейшей обработки. Возвращаемая строка должна быть добавлена к строкам, полученным в результате предыдущих вызовов метода.

336

Глава 24. Сжатие данных

flush()

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

24.2 gzip — работа с файлами, сжатыми программой gzip

Метод сжатия, предоставляемый модулем zlib, совместим с методом, используемым программой GNU gzip. Модуль gzip реализован поверх модуля zlib и предоставляет класс GzipFile, реализующий чтение и запись файлов в gzip-формате (RFC 1952). Упаковка и распаковка данных происходит автоматически, так что экземпляры класса GzipFile ведут себя аналогично обычным файловым объектам. Заметим, что этот модуль не позволяет работать с файлами дополнительных форматов (созданных программами compress и pack), которые могут быть распакованы программой gzip (gunzip).

GzipFile(filename [, mode [, compresslevel [, fileobj]]])

Возвращает объект аналогичный файловому, обеспечивающий прозрачную упаковку и распаковку данных. Экземпляры класса GzipFile имеют большинство методов, характерных для файловых объектов, кроме seek() и tell().

Если задан и не равен None аргумент fileobj (файловый или подобный объект), он будет использован для чтения/записи (аргумент filename в этом случае будет использован только в заголовке gzip-файла и может быть равен None), иначе будет открыт файл с именем filename.

Аргумент mode должен иметь одно из трех значений: ’rb’, ’ab’ или ’wb’. По умолчанию используется ’rb’.

Уровень сжатия устанавливается аргументом compresslevel, который должен быть целым числом от 1 до 9. По умолчанию используется значение 9, обеспечивающее максимальную степень сжатия.

Вызов метода close() экземпляра класса GzipFile не закрывает файловый объект fileobj. Это позволяет добавить дополнительные данные, а также извлечь результат, используя метод getvalue() экземпляра класса StringIO.

open(filename [, mode [, compresslevel]])

Эквивалентно вызову ‘GzipFile(filename, mode, compresslevel)’.

24.3zipfile — работа с zip-архивами

Этот модуль доступен, начиная с версии 1.6, и позволяет записывать и читать zip- архивы.

24.3. zipfile — работа с zip-архивами

337

error

Исключения этого класса генерируются, если указанный файл не является zip- архивом или поврежден.

is_zipfile(path)

Возвращает 1, если path является zip-архивом, иначе возвращает 0. Текущая реализация модуля не позволяет работать с архивами, содержащими комментарий.

ZipFile(filename [, mode [, compression]])

Возвращает объект, реализующий автоматическую упаковку/распаковку при чтении/записи файла с именем filename. Аргумент mode может иметь одно из трех значений: ’r’ (чтение), ’w’ (запись в новый архив) или ’a’ (добавление к существующему архиву). По умолчанию используется ’r’. В качестве аргумента compression может быть использована одна из приведенных ниже констант, при попытке использования недоступного метода генерируется исключение

RuntimeError.

PyZipFile(filename [, mode [, compression]])

Этот класс является производным от класса ZipFile и реализует один дополнительный метод, позволяющий создавать архивы файлов библиотек и пакетов языка Python.

ZipInfo([filename [, date_time]])

Создает и возвращает объект, описывающий файл в архиве. Аргумент filename определяет имя файла (по умолчанию используется ’NoName’), date_time — дату и время создания файла (кортеж из целых чисел: год, месяц, число, час, минута, секунда).

В настоящий момент модуль поддерживает только два метода сжатия (аргумент compression конструктора ZipFile):

ZIP_STORED

Упаковка данных без сжатия (используется по умолчанию).

ZIP_DEFLATED

Наиболее часто используемый в zip-файлах метод сжатия. Этот метод требует наличия модуля zlib.

Экземпляры классов ZipFile и PyZipFile имеют следующие атрибуты данных и методы:

namelist()

Возвращает список имен файлов, содержащихся в архиве.

infolist()

Возвращает список экземпляров класса ZipInfo, представляющих описание файлов, содержащихся в архиве.

338

Глава 24. Сжатие данных

printdir()

Выводит в стандартный поток вывода (sys.stdout) оглавление архива.

testzip()

Считывает все файлы архива и проверяет для них контрольные суммы. Возвращает имя первого файла, для которого контрольная сумма не сходится или None, если тест прошел успешно.

getinfo(name)

Возвращает экземпляр класса ZipInfo, представляющий описание файла name.

read(name)

Считывает файл с именем name из архива и возвращает его содержимое в виде строки.

write(filename [, arcname [, compress_type]])

Помещает файл с именем filename в архив под именем arcname (по умолчанию используется имя исходного файла) используя метод compress_type (по умолчанию используется метод, указанный при инициализации экземпляра).

writestr(zinfo, bytes)

Помещает файл в архив. В качестве содержимого файла используется аргумент bytes, информация об имени файла, времени его создания, методе сжатия и т. д. берется из объекта zinfo, который должен быть экземпляром класса ZipInfo.

close()

Закрывает файл (если архив был открыт для записи, дописывает завершающую запись).

Экземпляры класса PyZipFile имеют дополнительный метод:

writepy(pathname [, basename])

Если pathname является каталогом пакета, рекурсивно добавляет все ‘.py’-файлы в архив, если pathname является обычным каталогом — добавляет в архив файлы, находящиеся в этом каталоге, в противном случае pathname должен быть ‘.py’- файлом, который будет добавлен в архив. Все модули (‘.py’-файлы) добавляются в архив в компилированном виде (‘.pyo’ или ‘.pyc’).

Экземпляры класса ZipInfo имеют следующие (основные) атрибуты, описывающие файл в архиве, и метод:

filename

Имя файла.

date_time

Дата и время создания файла, кортеж из целых чисел: год, месяц, число, час, минута, секунда.

24.3. zipfile — работа с zip-архивами

339

compress_type

Метод сжатия.

comment

Комментарий (для каждого файла).

extra

Строка дополнительных данных.

CRC

Контрольная сумма CRC32 распакованного файла.

compress_size

Размер сжатого представления файла.

file_size

Размер распакованного файла.

FileHeader()

Печатает строку информации о файле в архиве.

340

Глава 25

Отладка и оптимизация кода на языке Python

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

pdb Средства отладки кода на языке Python.

profile Замер производительности кода на языке Python.

pstats Обработка статистических данных и вывод отчетов.

25.1 Отладчик кода на языке Python

Модуль pdb реализует интерактивный отладчик программ, написанных на языке Python. Он позволяет устанавливать точки останова, использовать пошаговое выполнение строк исходного кода, исследовать кадры стека, выводить исходный код и выполнять инструкции языка Python в контексте любого кадра стека. Этот модуль также позволяет осуществить “вскрытие трупа” программы или интерактивных инструкций, выполнение которых завершилось генерацией исключения.

Вы можете расширить возможности отладчика: все описанные в этом разделе функции реализованы с помощью класса Pdb (в настоящий момент не документирован).

Запуск под контролем отладчика производится следующим образом (в качестве приглашения отладчика используется ‘(Pdb) ’):

>>>import pdb

>>>import mymodule

>>>pdb.run(’mymodule.test()’) > <string>(0)?()

(Pdb) continue > <string>(1)?() (Pdb) continue

NameError: "There is no ... named ’spam’" > <string>(1)?()

(Pdb)