pyffi.formats.esp — Elder Scrolls plugin/master/save files (.esp, .esm, and .ess)

Implementation

class pyffi.formats.esp.EspFormat

Bases: pyffi.object_models.xml.FileFormat

This class implements the ESP format.

class Data

Bases: pyffi.object_models.Data

A class to contain the actual esp data.

inspect(stream)

Quickly checks if stream contains ESP data, and reads the header.

Parameters:stream (file) – The stream to inspect.
inspect_quick(stream)

Quickly checks if stream contains ESP data, and gets the version, by looking at the first 8 bytes.

Parameters:stream (file) – The stream to inspect.
read(stream)

Read a esp file.

Parameters:stream (file) – The stream from which to read.
write(stream)

Write a esp file.

Parameters:stream (file) – The stream to which to write.
class SubRecord(template=None, argument=None, parent=None)

Bases: pyffi.object_models.xml.struct_.StructBase

A subrecord.

data_size

Length of the data.

type

The type of the record.

class ZString(**kwargs)

Bases: pyffi.object_models.xml.basic.BasicBase, pyffi.object_models.editable.EditableLineEdit

String of variable length (null terminated).

>>> from tempfile import TemporaryFile
>>> f = TemporaryFile()
>>> s = ZString()
>>> if f.write('abcdefghijklmnopqrst\x00'.encode("ascii")): pass # b'abc...'
>>> if f.seek(0): pass # ignore result for py3k
>>> s.read(f)
>>> str(s)
'abcdefghijklmnopqrst'
>>> if f.seek(0): pass # ignore result for py3k
>>> s.set_value('Hi There!')
>>> s.write(f)
>>> if f.seek(0): pass # ignore result for py3k
>>> m = ZString()
>>> m.read(f)
>>> str(m)
'Hi There!'
get_hash(data=None)

Return a hash value for this string.

Returns:An immutable object that can be used as a hash.
get_size(data=None)

Return number of bytes this type occupies in a file.

Returns:Number of bytes.
get_value()

Return the string.

Returns:The stored string.
Return type:C{bytes}
read(stream, data=None)

Read string from stream.

Parameters:stream (file) – The stream to read from.
set_value(value)

Set string to C{value}.

Parameters:value (str (will be encoded as default) or C{bytes}) – The value to assign.
write(stream, data=None)

Write string to stream.

Parameters:stream (file) – The stream to write to.
byte

alias of Byte

char

alias of Char

float

alias of Float

int

alias of Int

short

alias of Short

ubyte

alias of UByte

uint

alias of UInt

uint64

alias of UInt64

ushort

alias of UShort

static version_number(version_str)

Converts version string into an integer.

Parameters:version_str (str) – The version string.
Returns:A version integer.
>>> hex(EspFormat.version_number('1.2'))
'0x102'

Regression tests

Read a ESP file

>>> # check and read esp file
>>> from os.path import dirname
>>> dirpath = __file__
>>> for i in range(4): #recurse up to root repo dir
...     dirpath = dirname(dirpath)
>>> repo_root = dirpath
>>> format_root = os.path.join(repo_root, 'tests', 'formats', 'esp')
>>> file = os.path.join(format_root, 'test.esp')
>>> stream = open(file, 'rb')
>>> data = EspFormat.Data()
>>> data.inspect(stream)
>>> # do some stuff with header?
>>> #data.header....
>>> data.read(stream)
>>> # do some stuff...

Parse all ESP files in a directory tree

>>> for stream, data in EspFormat.walkData(format_root):
...     try:
...         # the replace call makes the doctest also pass on windows
...         os_path = stream.name
...         split = (os_path.split(os.sep))[-4:]
...         rejoin = os.path.join(*split).replace(os.sep, "/")
...         print("reading %s" % rejoin)
...     except Exception:
...         print(
...             "Warning: read failed due corrupt file,"
...             " corrupt format description, or bug.") 
reading tests/formats/esp/test.esp

Create an ESP file from scratch and write to file

>>> data = EspFormat.Data()
>>> from tempfile import TemporaryFile
>>> stream = TemporaryFile()
>>> data.write(stream)