[ Россум, Дрейк, Откидач ] Язык программирования Python
.pdf23.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)
