Skip to main content

Java Property file parser and writer for Python

Project description

jProperties is a Java Property file parser and writer for Python. It aims to provide the same functionality as Java’s Properties class, although currently the XML property format is not supported.

1 Installation

You can install jProperties using pip:

pip install jproperties

2 Overview

Objects of the type Properties can be used like a Python dictionary (but see Caveats below). The load() method populates the object by parsing input in the Java Property file format; the store() method writes the key-value pairs stored in the object to a stream in the same format.

The load() and store() methods both take an encoding parameter. By default this is set to iso-8859-1, but it can be set to any encoding supported by Python, including e. g. the widely used utf-8.

2.1 Parsing a property file

from jproperties import Properties

p = Properties()
with open("foobar.properties", "rb") as f:
    p.load(f, "utf-8")

That’s it, p now can be used like a dictionary containing properties from foobar.properties.

2.2 Writing a property file

from jproperties import Properties

p = Properties()
p["foobar"] = "A very important message from our sponsors: Python is great!"

with open("foobar.properties", "wb") as f:
    p.store(f, encoding="utf-8")

2.3 Reading from and writing to the same file-like object

from jproperties import Properties

with open("foobar.properties", "r+b") as f:
    p = Properties()
    p.load(f, "utf-8")

    # Do stuff with the p object...

    f.seek(0)
    f.truncate(0)
    p.store(f, encoding="utf-8")

3 Special features

3.1 Metadata

The property file parser supports including programmatically readable and settable metadata in property files. Metadata for a key is represented as a Python dictionary; the keys and values of this dictionary should be strings, although when the property file is written, all non-string objects will be converted to strings. This is a one-way conversion; when the metadata is read back again during a load(), all keys and values will be treated as simple strings.

By default, the store() method does not write out the metadata. To enable that feature, set the keyword argument strip_meta=False when calling the method.

Note that metadata support is always enabled. The only thing that is optional is actually writing out the metadata.

Metadata keys beginning with two underscores (__) are not written to the output stream by the store() method. Thus, they can be used to attach “runtime-only” metadata to properties. Currently, however, metadata with such keys is still read from the input stream by load(); this should probably be considered erroneous behaviour.

3.1.1 Documenting Properties

The comments after a property definition can be added to the metadata with the key _doc if the metadoc=True optional argument is given to the load method. This allows properties to be documented in the properties file. For example, the properties file:

#: _severity=fatal
10001=Fatal internal error: %s
# A fatal internal error occurred.  Please re-run the command
# with the -D option to generate additional debug information.

The following example code shows how this documentation can be accessed.

from jproperties import Properties

p = Properties()
with open("foobar.properties", "rb") as f:
    p.load(f, "utf-8", metadoc=True)
# Print the explicitly defined '_severity' metadata
print("Severity: ", p.getmeta("10001")['_severity'])
# Print the implicitly defined '_doc' metadata
print("Explanation: ", p.getmeta("10001")['_doc'])

The documentation can be extracted from properties files and used to generate pages in the overall system documentation or can be accessed via options for command line utilities.

3.1.2 Caveats

Metadata support influences how Properties objects are used as dictionary objects:

  • To set a value for a key, do prop_object[key] = value or prop_object[key] = value, metadata. The first form will leave the key’s metadata unchanged. You can also use the setmeta() method to set a key’s metadata.

  • To get the value of a key, do value, metadata = prop_object[key]. If there is no metadata for a key, metadata will be an empty dictionary. To retrieve only the metadata for a key, the getmeta() method can be used.

  • When used as an iterator, Properties objects will simply return all keys in an unspecified order. No metadata is returned (but can be retrieved using getmeta()).

3.2 Setting defaults

The internal dictionary holding the key-value pairs can be accessed using the properties property. Deleting that property deletes all key-value pairs from the object.

However, modifying properties using this special property will not modify metadata in any way. That means that deleting properties by doing del prop_obj.properties[key] will not remove the associated metadata from the object. Instead, do del prop_obj[key].

The properties property is nevertheless useful to set many default values before parsing a property file:

from jproperties import Properties

prop_obj = Properties()
prop_obj.properties = a_big_dictionary_with_defaults
file_obj = codecs.open("foobar.properties", "rb", "iso-8859-1")
prop_obj.load(file_obj, encoding=None)

3.3 Development

If you want to help development, there is overview documentation

4 Version history

4.1 Version 2.1.2

  • Set minium required Python version in package metadata.

This is the last version supporting Python 2.7.

4.2 Version 2.1.1

  • Compatibility with Python 3.10. (#10)

  • Documentation improvements. (#13)

  • Support decoding surrogate pairs on narrow Python builds (such as Python 2.7 on Mac OS X). (#14)

4.3 Version 2.1.0

4.4 Version 2.0.0

  • Python 3 support! Thanks to @tboz203, who did a lot of the work. (#1)

  • Drop support for Python 2.6.

4.5 Version 1.0.1

  • This is the first “proper” PyPI release, with proper PyPI metadata and proper PyPI distributions. Nothing else has changed.

4.6 Version 1.0

  • Initial release

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jproperties-2.1.2.tar.gz (23.9 kB view details)

Uploaded Source

Built Distribution

jproperties-2.1.2-py2.py3-none-any.whl (18.0 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file jproperties-2.1.2.tar.gz.

File metadata

  • Download URL: jproperties-2.1.2.tar.gz
  • Upload date:
  • Size: 23.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.1.dev0+g94f810c.d20240510 CPython/3.12.4

File hashes

Hashes for jproperties-2.1.2.tar.gz
Algorithm Hash digest
SHA256 036fcd52c10a8a1c21e6fa2a1c292c93892e759b76490acc4809213a36ddc329
MD5 a986e1687f538771be4d48037095986a
BLAKE2b-256 be2700abf648c6d573275d409b70196b66d9fb40ef03b8d1baf671ae3774e145

See more details on using hashes here.

File details

Details for the file jproperties-2.1.2-py2.py3-none-any.whl.

File metadata

  • Download URL: jproperties-2.1.2-py2.py3-none-any.whl
  • Upload date:
  • Size: 18.0 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.1.dev0+g94f810c.d20240510 CPython/3.12.4

File hashes

Hashes for jproperties-2.1.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 4108e868353a9f4a12bb86a92df5462d0e18d00119169533972ce473029be79a
MD5 781781506a6a4d263ee63ce6e7b551e9
BLAKE2b-256 756f55bc5837e9fe7a86a5acb553adec901257d709062bfaef7debd4d8cfee12

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page