File Formats
The following formats are supported for serialization.
YAML
By default, datafiles uses the YAML language for serialization. Any of the following file extensions will use this format:
.yml
.yaml
- (no extension)
Sample output:
my_dict:
value: 0
my_list:
- value: 1
- value: 2
my_bool: true
my_float: 1.23
my_int: 42
my_str: Hello, world!
Where possible, comments and whitespace are preserved in files as shown in this notebook.
JSON
The JSON language is also supported. Any of the following file extensions will use this format:
.json
.json5
Sample output:
{
"my_dict": {
"value": 0
},
"my_list": [
{
"value": 1
},
{
"value": 2
}
],
"my_bool": true,
"my_float": 1.23,
"my_int": 42,
"my_str": "Hello, world!"
}
Additional examples can be found in this notebook.
TOML
The TOML language is also supported. Any of the following file extensions will use this format:
.toml
Sample output:
my_bool = true
my_float = 1.23
my_int = 42
my_str = "Hello, world!"
[[my_list]]
value = 1
[[my_list]]
value = 2
[my_dict]
value = 0
Additional examples can be found in this notebook.
Custom Formats
Additional formats are supported through a registration system.
Map Existing
To map one of the existing formatter classes to a new file extension:
from datafile import datafile, formats
formats.register(".conf", formats.YAML)
@datafile("my-file-path.conf")
class MyConfig:
...
New Format
To support new formats, extend the datafiles.formats.Formatter
base class:
from datafile import datafile, formats
class MyFormat(formats.Format):
@classmethod
def extensions(cls) -> list[str]:
return [".my_ext"]
@classmethod
def deserialize(cls, file_object: IO) -> dict:
# Read `file_object` and return a dictionary
@classmethod
def serialize(cls, data: dict) -> str:
# Convert `data` to a string
formats.register(".my_ext", MyFormat)
@datafile("my-file-path.my_ext")
class MyConfig:
...