Python Module of the Week, Release 1.132
import zipfile_pyzipfile
print ’Imported from:’, zipfile_pyzipfile.__file__
With the debugattribute ofthe PyZipFile set to3,verbose debugging is enabledandyoucan observe as it compiles
each .py file it finds.
$ python zipfile_pyzipfile.py
Adding python files
Adding package in . as .
Compiling ./__init__.py
Adding ./__init__.pyc
Compiling ./zipfile_append.py
Adding ./zipfile_append.pyc
Compiling ./zipfile_getinfo.py
Adding ./zipfile_getinfo.pyc
Compiling ./zipfile_infolist.py
Adding ./zipfile_infolist.pyc
Compiling ./zipfile_is_zipfile.py
Adding ./zipfile_is_zipfile.pyc
Compiling ./zipfile_namelist.py
Adding ./zipfile_namelist.pyc
Compiling ./zipfile_printdir.py
Adding ./zipfile_printdir.pyc
Compiling ./zipfile_pyzipfile.py
Adding ./zipfile_pyzipfile.pyc
Compiling ./zipfile_read.py
Adding ./zipfile_read.pyc
Compiling ./zipfile_write.py
Adding ./zipfile_write.pyc
Compiling ./zipfile_write_arcname.py
Adding ./zipfile_write_arcname.pyc
Compiling ./zipfile_write_compression.py
Adding ./zipfile_write_compression.pyc
Compiling ./zipfile_writestr.py
Adding ./zipfile_writestr.pyc
Compiling ./zipfile_writestr_zipinfo.py
Adding ./zipfile_writestr_zipinfo.pyc
__init__.pyc
zipfile_append.pyc
zipfile_getinfo.pyc
zipfile_infolist.pyc
zipfile_is_zipfile.pyc
zipfile_namelist.pyc
zipfile_printdir.pyc
zipfile_pyzipfile.pyc
zipfile_read.pyc
zipfile_write.pyc
zipfile_write_arcname.pyc
zipfile_write_compression.pyc
zipfile_writestr.pyc
zipfile_writestr_zipinfo.pyc
Imported from: zipfile_pyzipfile.zip/zipfile_pyzipfile.pyc
See also:
zipfile(http://docs.python.org/library/zipfile.html) Thestandardlibrarydocumentationforthismodule.
zlib ZIPcompressionlibrary
13.4. zipfile – Read and write ZIP archive files
325
Pdf signatures - C# PDF File Permission Library: add, remove, update PDF file permission in C#.net, ASP.NET, MVC, WPF
Tell C# users how to set PDF file permissions, like printing, copying, modifying, extracting, annotating, form filling, etc
create pdf stamp signature; pdf will signature
Pdf signatures - VB.NET PDF File Permission Library: add, remove, update PDF file permission in vb.net, ASP.NET, MVC, WPF
VB.NET Tutorial for How to Set PDF File Access Permissions Using XDoc.PDF for .NET
add signature to pdf acrobat; create pdf signature stamp
Python Module of the Week, Release 1.132
tarfile Readandwritetararchives
zipimport ImportPythonmodulesfromZIParchive.
PKZIP ApplicationNote(http://www.pkware.com/documents/casestudies/APPNOTE.TXT) Official l specifica-
tion for the ZIP archive format.
13.5 zlib – Low-level access to GNU zlib compression library
Purpose Low-level access to GNU zlib compression library
Available In 2.5 and later
Thezlib module provides a lower-level interface to many of the functions in thezlib compression library from
GNU.
13.5.1 Working with Data in Memory
The simplest way to work withzlib requires holding all of the data to be compressed or decompressed in memory,
and then using compress() and decompress().
import zlib
import binascii
original_data ’This is s the original l text.’
print ’Original
:’len(original_data), original_data
compressed = zlib.compress(original_data)
print ’Compressed
:’len(compressed), binascii.hexlify(compressed)
decompressed = zlib.decompress(compressed)
print ’Decompressed :’, len(decompressed), decompressed
$ python zlib_memory.py
Original
: 26 This is the original text.
Compressed
: 32 789c0bc9c82c5600a2928c5485fca2ccf4ccbcc41c8592d48a123d007f2f097e
Decompressed : 26 This is the original text.
Notice that for short text, the compressed version canbe longer. While the actual results depend on the input data, for
short bits of text it is interesting to observe the compression overhead.
import zlib
original_data ’This is s the original l text.’
fmt %15s
%15s
print fmt (’len(data)’’len(compressed)’)
print fmt (’-’
*
15’-’
*
15)
for i in xrange(20):
data = original_data
*
i
compressed = zlib.compress(data)
print fmt (len(data), len(compressed)), 
*
’ if len(data) len(compressed) else ’’
326
Chapter 13. Data Compression and Archiving
C# PDF Digital Signature Library: add, remove, update PDF digital
less. How to C#: Add Digital Signatures to PDF. Help to Improve the Security of Your PDF File by Adding Digital Signatures. Overview.
create pdf signature field; pdf signature
VB.NET PDF Digital Signature Library: add, remove, update PDF
copy, paste, C#.NET rotate PDF pages, C#.NET search text in PDF, C#.NET edit PDF bookmark, C#.NET edit PDF metadata, C#.NET edit PDF digital signatures, C#.NET
add signature to pdf file; create transparent signature stamp for pdf
Python Module of the Week, Release 1.132
$ python zlib_lengths.py
len(data)
len(compressed)
---------------
---------------
0
8
*
26
32
*
52
35
78
35
104
36
130
36
156
36
182
36
208
36
234
36
260
36
286
36
312
37
338
37
364
38
390
38
416
38
442
38
468
38
494
38
13.5.2 Working with Streams
The in-memory approach has obvious drawbacks that make it impractical for real-world use cases. The alternative is
to use Compress and Decompress objects to manipulate streams of data, so that the entire data set does not have
to fit into memory.
The simple server below responds to requests consisting of filenames by writing a compressed version of the file to
the socket used to communicate with the client. It has some artificial chunking in place to illustrate the buffering
behaviorthat happens whenthe data passed to compress() or decompress() doesn’t result in a complete block
ofcompressed or uncompressed output.
Warning: This server has obvious security implications. Do not run it on a system on the open internet or in any
environment where security might be an issue.
import zlib
import logging
import SocketServer
import binascii
BLOCK_SIZE 64
class ZlibRequestHandler(SocketServer.BaseRequestHandler):
logger = logging.getLogger(’Server’)
def handle(self):
compressor = zlib.compressobj(1)
# Find out what file the client wants
filename self.request.recv(1024)
self.logger.debug(’client asked for: : "%s"’, filename)
13.5. zlib – Low-level access to GNU zlib compression library
327
C# HTML5 Viewer: Load, View, Convert, Annotate and Edit PDF
HTML5 Viewer for C# .NET enables you to create signatures to PDF, including freehand signature, text and date signature. If you
add signature to pdf preview; adding signature to pdf files
C# HTML5 Viewer: Load, View, Convert, Annotate and Edit Excel
Robust API can help users freely implement conversion from Excel document to PDF, Tiff and HTML file. HTML5 Viewer. Excel document protection with signatures.
sign pdf; adding signature to pdf doc
Python Module of the Week, Release 1.132
# Send chunks of the file as they are compressed
with open(filename, ’rb’) as input:
while True:
block input.read(BLOCK_SIZE)
if not block:
break
self.logger.debug(’RAW "%s"’, block)
compressed = compressor.compress(block)
if compressed:
self.logger.debug(’SENDING "%s"’, binascii.hexlify(compressed))
self.request.send(compressed)
else:
self.logger.debug(’BUFFERING’)
# Send any data being buffered by the compressor
remaining = compressor.flush()
while remaining:
to_send = remaining[:BLOCK_SIZE]
remaining = remaining[BLOCK_SIZE:]
self.logger.debug(’FLUSHING "%s"’, binascii.hexlify(to_send))
self.request.send(to_send)
return
if __name__ == ’__main__’:
import socket
import threading
from cStringIO import StringIO
logging.basicConfig(level=logging.DEBUG,
format=%(name)s%(message)s,
)
logger = logging.getLogger(’Client’)
# Set up a server, running in a separate thread
address = (’localhost’0# let t the kernel give us s a a port
server = SocketServer.TCPServer(address, ZlibRequestHandler)
ip, port = server.server_address # find out t what port we e were e given
= threading.Thread(target=server.serve_forever)
t.setDaemon(True)
t.start()
# Connect to the server
logger.info(’Contacting server on %s:%s, ip, port)
= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
# Ask for a file
requested_file ’lorem.txt’
logger.debug(’sending filename: : "%s"’, requested_file)
len_sent = s.send(requested_file)
# Receive a response
buffer StringIO()
decompressor = zlib.decompressobj()
while True:
response = s.recv(BLOCK_SIZE)
328
Chapter 13. Data Compression and Archiving
C# PDF Library SDK to view, edit, convert, process PDF file for C#
WinFoms project. Support protecting PDF file by adding password and digital signatures with C# sample code in .NET Class. Feel free
add signature to pdf in preview; adding signature to pdf in preview
VB.NET Create PDF Library SDK to convert PDF from other file
Create and save editable PDF with a blank page, bookmarks, links, signatures, etc. Create fillable PDF document with fields in Visual Basic .NET application.
adding signature to pdf files; create pdf signature box
Python Module of the Week, Release 1.132
if not response:
break
logger.debug(’READ "%s"’, binascii.hexlify(response))
# Include any unconsumed data when feeding the decompressor.
to_decompress = decompressor.unconsumed_tail + response
while to_decompress:
decompressed = decompressor.decompress(to_decompress)
if decompressed:
logger.debug(’DECOMPRESSED "%s"’, decompressed)
buffer.write(decompressed)
# Look for unconsumed data due to buffer overflow
to_decompress = decompressor.unconsumed_tail
else:
logger.debug(’BUFFERING’)
to_decompress None
# deal with data reamining inside the decompressor buffer
remainder = decompressor.flush()
if remainder:
logger.debug(’FLUSHED "%s"’, remainder)
buffer.write(reaminder)
full_response buffer.getvalue()
lorem open(’lorem.txt’’rt’).read()
logger.debug(’response matches s file contents: %s, full_response == lorem)
# Clean up
s.close()
server.socket.close()
$ python zlib_server.py
Client: Contacting server on 127.0.0.1:56229
Client: sending filename: "lorem.txt"
Server: client asked for: "lorem.txt"
Server: RAW "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec
"
Server: SENDING "7801"
Server: RAW "egestas, enim et consectetuer ullamcorper, lectus ligula rutrum "
Server: BUFFERING
Client: READ "7801"
Server: RAW "leo, a
elementum elit tortor eu quam. Duis tincidunt nisi ut ant"
Client: BUFFERING
Server: BUFFERING
Server: RAW "e. Nulla
facilisi. Sed tristique eros eu libero. Pellentesque ve"
Server: BUFFERING
Server: RAW "l arcu. Vivamus
purus orci, iaculis ac, suscipit sit amet, pulvi"
Server: BUFFERING
Server: RAW "nar eu,
lacus. Praesent placerat tortor sed nisl. Nunc blandit d"
Server: BUFFERING
Server: RAW "iam egestas
dui. Pellentesque habitant morbi tristique senectus "
Server: BUFFERING
13.5. zlib – Low-level access to GNU zlib compression library
329
C# WPF Viewer: Load, View, Convert, Annotate and Edit PDF
Insert text box to PDF file. • Draw markups to PDF document. PDF Protection. • Add signatures to PDF document. • Erase PDF text. • Erase PDF images.
create pdf signature; pdf sign in
VB.NET PDF - WPF PDF Viewer for VB.NET Program
copy, paste, C#.NET rotate PDF pages, C#.NET search text in PDF, C#.NET edit PDF bookmark, C#.NET edit PDF metadata, C#.NET edit PDF digital signatures, C#.NET
pdf signature field; add signature box to pdf
Python Module of the Week, Release 1.132
Server: RAW "et netus et
malesuada fames ac turpis egestas. Aliquam viverra f"
Server: BUFFERING
Server: RAW "ringilla
leo. Nulla feugiat augue eleifend nulla. Vivamus mauris"
Server: BUFFERING
Server: RAW ". Vivamus sed
mauris in nibh placerat egestas. Suspendisse poten"
Server: BUFFERING
Server: RAW "ti. Mauris massa. Ut
eget velit auctor tortor blandit sollicitud"
Server: BUFFERING
Server: RAW "in. Suspendisse imperdiet
justo.
"
Server: BUFFERING
Server: FLUSHING "5592418edb300c45f73e050f60f80e05ba6c8b0245bb676426c382923c22e9f3f70bc94c1ac00b9b963eff7fe4b73ea4921e9e95f66e7d906b105789954a6f2e"
Server: FLUSHING "25245206f1ae877ad17623318d8dbef62665919b78b0af244d2b49bc5e4a33aea58f43c64a06ad7432bda5318d8c819e267d255ec4a44a0b14a638451f784892"
Client: READ "5592418edb300c45f73e050f60f80e05ba6c8b0245bb676426c382923c22e9f3f70bc94c1ac00b9b963eff7fe4b73ea4921e9e95f66e7d906b105789954a6f2e"
Server: FLUSHING "de932b7aa53a85b6a27bb6a0a6ae94b0d94236fa31bb2c572e6aa86ff44b768aa11efa9e4232ba4f21d30b5e37fa2966e8243e7f9e62c4a3e4467ff4e49abe1c"
Client: DECOMPRESSED "Lorem ipsum dolor sit amet, conse"
Server: FLUSHING "39e0b18fa22b299784247159c913d90f587be239d24e6d3c6dae8be1ac437db038e4e94041067f467198826d9b765ba18b71dba1b62b23f29de1b227dcbff87b"
Client: READ "25245206f1ae877ad17623318d8dbef62665919b78b0af244d2b49bc5e4a33aea58f43c64a06ad7432bda5318d8c819e267d255ec4a44a0b14a638451f784892"
Server: FLUSHING "e38b065252ede3a2ffa5428f3b4d106f181022c652d9c49377a62b06387d53e4c0d43e3a6cf4c500052d4f3d650c1c1c18a84e7e18c403255d256f0aeb9cb709"
Client: DECOMPRESSED "ctetuer adipiscing elit. Donec
egestas, enim et consectetuer ullamcorper, lectus ligula rutrum leo, a
elementum elit tortor eu"
Server: FLUSHING "d044afd2607f72fe24459513909fdf480807b346da90f5f2f684f04888d9a41fd05277a1a3074821f2f7fbadcaeed0ff1d73a962ce666e6296b9098f85f8c0e6"
Client: READ "de932b7aa53a85b6a27bb6a0a6ae94b0d94236fa31bb2c572e6aa86ff44b768aa11efa9e4232ba4f21d30b5e37fa2966e8243e7f9e62c4a3e4467ff4e49abe1c"
Server: FLUSHING "dd4c8b46eeda5e45b562d776058dbfe9d1b7e51f6f370ea5"
Client: DECOMPRESSED " quam. Duis tincidunt nisi ut ante. Nulla
facilisi. Sed tristique eros eu libero. Pellentesque vel arcu. Vivamus
p"
Client: READ "39e0b18fa22b299784247159c913d90f587be239d24e6d3c6dae8be1ac437db038e4e94041067f467198826d9b765ba18b71dba1b62b23f29de1b227dcbff87b"
Client: DECOMPRESSED "urus orci, iaculis ac, suscipit sit amet, pulvinar eu,
lacus. Praesent placerat tortor sed nisl. Nunc blandit diam egestas
dui. Pellentesque "
Client: READ "e38b065252ede3a2ffa5428f3b4d106f181022c652d9c49377a62b06387d53e4c0d43e3a6cf4c500052d4f3d650c1c1c18a84e7e18c403255d256f0aeb9cb709"
Client: DECOMPRESSED "habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Aliquam viverra fringilla
leo. Nulla feugiat aug"
Client: READ "d044afd2607f72fe24459513909fdf480807b346da90f5f2f684f04888d9a41fd05277a1a3074821f2f7fbadcaeed0ff1d73a962ce666e6296b9098f85f8c0e6"
Client: DECOMPRESSED "ue eleifend nulla. Vivamus mauris. Vivamus sed
mauris in nibh placerat egestas. Suspendisse potenti. Mauris massa. Ut
eget velit auctor tortor blandit s"
Client: READ "dd4c8b46eeda5e45b562d776058dbfe9d1b7e51f6f370ea5"
Client: DECOMPRESSED "ollicitudin. Suspendisse imperdiet
justo.
"
Client: response matches file contents: True
13.5.3 Mixed Content Streams
The Decompress class returned by decompressobj() can also be used in situations where compressed and
uncompressed data is mixedtogether. After decompressingall ofthe data,the unused_dataattribute contains any data
not used.
330
Chapter 13. Data Compression and Archiving
VB.NET Create PDF from Excel Library to convert xlsx, xls to PDF
copy, paste, C#.NET rotate PDF pages, C#.NET search text in PDF, C#.NET edit PDF bookmark, C#.NET edit PDF metadata, C#.NET edit PDF digital signatures, C#.NET
adding signature to pdf document; create transparent signature stamp for pdf
VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
copy, paste, C#.NET rotate PDF pages, C#.NET search text in PDF, C#.NET edit PDF bookmark, C#.NET edit PDF metadata, C#.NET edit PDF digital signatures, C#.NET
add jpeg signature to pdf; add signature to pdf preview
Python Module of the Week, Release 1.132
import zlib
lorem open(’lorem.txt’’rt’).read()
compressed = zlib.compress(lorem)
combined = compressed + lorem
decompressor = zlib.decompressobj()
decompressed = decompressor.decompress(combined)
print ’Decompressed matches lorem:’, decompressed == lorem
print ’Unused data matches s lorem :’, decompressor.unused_data == lorem
$ python zlib_mixed.py
Decompressed matches lorem: True
Unused data matches lorem : True
13.5.4 Checksums
In addition to compression and decompression functions,zlib includes two functions for computing checksums of
data, adler32() and crc32(). Neither checksum is billed as cryptographically secure,and theyare onlyintended
for use for data integrity verification.
Both functions take the same arguments, a string of data and an optional value to be used as a starting point for the
checksum. They return a 32-bit signed integer value which can also be passed back on subsequent calls as a new
starting point argument to produce a running checksum.
import zlib
data open(’lorem.txt’’r’).read()
cksum = zlib.adler32(data)
print ’Adler32: %12d’ cksum
print 
%12d’ ’ zlib.adler32(data, cksum)
cksum = zlib.crc32(data)
print ’CRC-32 : %12d’ cksum
print 
%12d’ ’ zlib.crc32(data, cksum)
$ python zlib_checksums.py
Adler32:
1865879205
:
118955337
CRC-32 :
1878123957
:
-1940264325
The Adler32 algorithm is said to be faster than a standard CRC, but I found it to be slower in my own tests.
import timeit
iterations 1000
def show_results(title, result, , iterations):
"Print results in terms of microseconds per pass and per item."
per_pass 1000000
*
(result / iterations)
print %s:\t%.2f usec/pass’ (title, per_pass)
13.5. zlib – Low-level access to GNU zlib compression library
331
Python Module of the Week, Release 1.132
adler32 = timeit.Timer(
stmt="zlib.adler32(data)",
setup="import zlib; data=open(’lorem.txt’,’r’).read()
*
10",
)
show_results(’Adler32, separate’, adler32.timeit(iterations), iterations)
adler32_running = timeit.Timer(
stmt="cksum = = zlib.adler32(data, cksum)",
setup="import zlib; data=open(’lorem.txt’,’r’).read()
*
10; cksum = zlib.adler32(data)",
)
show_results(’Adler32, running’, adler32_running.timeit(iterations), iterations)
crc32 = timeit.Timer(
stmt="zlib.crc32(data)",
setup="import zlib; data=open(’lorem.txt’,’r’).read()
*
10",
)
show_results(’CRC-32, separate’, crc32.timeit(iterations), iterations)
crc32_running = timeit.Timer(
stmt="cksum = = zlib.crc32(data, cksum)",
setup="import zlib; data=open(’lorem.txt’,’r’).read()
*
10; cksum = zlib.crc32(data)",
)
show_results(’CRC-32, running’, crc32_running.timeit(iterations), iterations)
$ python zlib_checksum_tests.py
Adler32, separate:
1.07 usec/pass
Adler32, running:
1.10 usec/pass
CRC-32, separate:
9.78 usec/pass
CRC-32, running:
9.73 usec/pass
See also:
zlib(http://docs.python.org/library/zlib.html) Thestandardlibrarydocumentationforthismodule.
gzip Thegzipmoduleincludesahigherlevel(file-based)interfacetothezliblibrary.
http://www.zlib.net/ Homepageforzliblibrary.
http://www.zlib.net/manual.html Completezlibdocumentation.
bz2 Thebz2moduleprovidesasimilarinterfacetothebzip2compressionlibrary.
332
Chapter 13. Data Compression and Archiving
CHAPTER
FOURTEEN
DATA PERSISTENCE
The standard library includes a variety of modules for persisting data. The most common pattern for storing data
from Python objects for reuse is to serialize them withpickle and then either write them directly to a file or store
them using one of the many key-value pair database formats available with the dbm API. If you don’t care about the
underlying dbm format,the best persistence interface is provided byshelve. If you do care, you can use one of the
other dbm-based modules directly.
14.1 anydbm – Access to DBM-style databases
Purpose anydbm provides a generic dictionary-like interface to DBM-style, string-keyed databases
Available In 1.4 and later
anydbm is a front-end for DBM-style databases that use simple string values as keys to access records containing
strings. It uses thewhichdb module to identifydbhashgdbm, anddbm databases, then opens them with the
appropriate module. It is used as a backend forshelve, whichknows how to store objects usingpickle.
14.1.1 Creating a New Database
The storage format for new databases is selected by looking for each of these modules in order:
• dbhash
• gdbm
• dbm
• dumbdbm
The open() function takes flags to control how the database file is managed. To create a new database when neces-
sary, use ’c’. To always create a new database, use ’n’.
import anydbm
db = anydbm.open(’/tmp/example.db’’n’)
db[’key’’value’
db[’today’’Sunday’
db[’author’’Doug’
db.close()
$ python anydbm_new.py
In this example,the file is always re-initialized. To see what type of database was created, we can usewhichdb.
333
Python Module of the Week, Release 1.132
import whichdb
print whichdb.whichdb(’/tmp/example.db’)
Your results may vary,depending on what modules are installed on yoursystem.
$ python anydbm_whichdb.py
dbhash
14.1.2 Opening an Existing Database
To open an existing database, use flags ofeither ’r’ (for read-only)or ’w’ (for read-write). You don’t need toworry
abouttheformat,because existingdatabases are automaticallygiven towhichdbtoidentify. If afile canbeidentified,
the appropriate module is used to open it.
import anydbm
db = anydbm.open(’/tmp/example.db’’r’)
try:
print ’keys():’, db.keys()
for k, v in db.iteritems():
print ’iterating:’, k, v
print ’db["author"] =’, db[’author’]
finally:
db.close()
Once open, db is a dictionary-like object, with support for the usual methods:
$ python anydbm_existing.py
keys(): [’author’, ’key’, ’today’]
iterating: author Doug
iterating: key value
iterating: today Sunday
db["author"] = Doug
14.1.3 Error Cases
The keys of the database need to be strings.
import anydbm
db = anydbm.open(’/tmp/example.db’’w’)
try:
db[1’one’
except TypeError, err:
print %s%s’ (err.__class__.__name__, err)
finally:
db.close()
Passing another type results in aTypeError.
$ python anydbm_intkeys.py
TypeError: Integer keys only allowed for Recno and Queue DB’s
334
Chapter 14. Data Persistence
Documents you may be interested
Documents you may be interested