--- title: Data Files permalink: /docs/datafiles/ --- In addition to the [built-in variables]({{'/docs/variables/' | relative_url }}) available from Jekyll, you can specify your own custom data that can be accessed via the [Liquid templating system](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers). Jekyll supports loading data from [YAML](http://yaml.org/), [JSON](http://www.json.org/), [CSV](https://en.wikipedia.org/wiki/Comma-separated_values), and [TSV](https://en.wikipedia.org/wiki/Tab-separated_values) files located in the `_data` directory. Note that CSV and TSV files *must* contain a header row. This powerful feature allows you to avoid repetition in your templates and to set site specific options without changing `_config.yml`. Plugins/themes can also leverage Data Files to set configuration variables. ## The Data Folder The `_data` folder is where you can store additional data for Jekyll to use when generating your site. These files must be YAML, JSON, TSV or CSV files (using either the `.yml`, `.yaml`, `.json`, `.tsv`, or `.csv` extension), and they will be accessible via `site.data`. ## Example: List of members Here is a basic example of using Data Files to avoid copy-pasting large chunks of code in your Jekyll templates: In `_data/members.yml`: ```yaml - name: Eric Mill github: konklone - name: Parker Moore github: parkr - name: Liu Fengyun github: liufengyun ``` Or `_data/members.csv`: ``` name,github Eric Mill,konklone Parker Moore,parkr Liu Fengyun,liufengyun ``` This data can be accessed via `site.data.members` (notice that the file's *basename* determines the variable name and therefore one should avoid having data files with the same basename but different extensions, in the same directory). You can now render the list of members in a template: {% raw %} ```liquid ``` {% endraw %} ## Subfolders Data files can also be placed in sub-folders of the `_data` folder. Each folder level will be added to a variable's namespace. The example below shows how GitHub organizations could be defined separately in a file under the `orgs` folder: In `_data/orgs/jekyll.yml`: ```yaml username: jekyll name: Jekyll members: - name: Tom Preston-Werner github: mojombo - name: Parker Moore github: parkr ``` In `_data/orgs/doeorg.yml`: ```yaml username: doeorg name: Doe Org members: - name: John Doe github: jdoe ``` The organizations can then be accessed via `site.data.orgs`, followed by the file name: {% raw %} ```liquid ``` {% endraw %} ## Example: Accessing a specific author Pages and posts can also access a specific data item. The example below shows how to access a specific item: `_data/people.yml`: ```yaml dave: name: David Smith twitter: DavidSilvaSmith ``` The author can then be specified as a page variable in a post's front matter: {% raw %} ```liquid --- title: sample post author: dave --- {% assign author = site.data.people[page.author] %} ``` {% endraw %} For information on how to build robust navigation for your site (especially if you have a documentation website or another type of Jekyll site with a lot of pages to organize), see [Navigation]({{ '/tutorials/navigation/' | relative_url }}). ## CSV/TSV Parse Options The way Ruby parses CSV and TSV files can be customized with the `csv_reader` and `tsv_reader` configuration options. Each configuration key exposes the same options: `converters`: What [CSV converters](https://ruby-doc.org/stdlib-2.5.0/libdoc/csv/rdoc/CSV.html#Converters) should be used when parsing the file. Available options are `integer`, `float`, `numeric`, `date`, `date_time` and `all`. By default, this list is empty. `encoding`: What encoding the files are in. Defaults to the site `encoding` configuration option. `headers`: Boolean field for whether to parse the first line of the file as headers. When `false`, it treats the first row as data. Defaults to `true`. Examples: ```yaml csv_reader: converters: - numeric - datetime headers: true encoding: utf-8 tsv_reader: converters: - all headers: false ```