Skip to main content

yq: Command-line YAML/XML/TOML processor - jq wrapper for YAML, XML, TOML documents

Installation

pip install yq

Before using yq, you also have to install its dependency, jq. See the jq installation instructions for details and directions specific to your platform.

On macOS, yq is also available on Homebrew: use brew install python-yq.

Synopsis

yq takes YAML input, converts it to JSON, and pipes it to jq:

cat input.yml | yq .foo.bar

Like in jq, you can also specify input filename(s) as arguments:

yq .foo.bar input.yml

By default, no conversion of jq output is done. Use the --yaml-output/-y option to convert it back into YAML:

cat input.yml | yq -y .foo.bar

Mapping key order is preserved. By default, custom YAML tags and styles in the input are ignored. Use the --yaml-roundtrip/-Y option to preserve YAML tags and styles by representing them as extra items in their enclosing mappings and sequences while in JSON:

yq -Y .foo.bar input.yml

yq can be called as a module if needed. With -y/-Y, files can be edited in place like with sed -i:

python -m yq -Y --indentless --in-place '.["current-context"] = "staging-cluster"' ~/.kube/config

Use the --width/-w option to pass the line wrap width for string literals; --width 0 disables wrapping. Use --explicit-start/--explicit-end to emit YAML start/end markers even when processing a single document. YAML output preserves an explicit leading --- from the input and emits one for multidocument streams. All other command line arguments are forwarded to jq. yq forwards the exit code jq produced, unless there was an error in YAML parsing, in which case the exit code is 1. See the jq manual for more details on jq features and options.

Because YAML treats JSON as a dialect of YAML, you can use yq to convert JSON to YAML: yq -y . < in.json > out.yml.

Preserving tags, styles, and comments using the -Y (--yaml-roundtrip) option

The -Y option helps preserve custom string styles and tags in your document. For example, consider the following document (an AWS CloudFormation template fragment):

Resources:
  ElasticLoadBalancer:
    Type: 'AWS::ElasticLoadBalancing::LoadBalancer'
    Properties:
      AvailabilityZones: !GetAZs ''
      Instances:
        - !Ref Ec2Instance1
        - !Ref Ec2Instance2
      Description: >-
        Load balancer for Big Important Service.

        Good thing it's managed by this template.

Passing this document through yq -y .Resources.ElasticLoadBalancer will drop custom tags, such as !Ref, and styles, such as the folded style of the Description field:

Type: AWS::ElasticLoadBalancing::LoadBalancer
Properties:
  AvailabilityZones: ''
  Instances:
    - Ec2Instance1
    - Ec2Instance2
  Description: 'Load balancer for Big Important Service.

    Good thing it''s managed by this template.'

By contrast, passing it through yq -Y .Resources.ElasticLoadBalancer will preserve tags, styles, and comments:

Type: 'AWS::ElasticLoadBalancing::LoadBalancer'
Properties:
  AvailabilityZones: !GetAZs ''
  Instances:
    - !Ref 'Ec2Instance1'
    - !Ref 'Ec2Instance2'
  Description: >-
    Load balancer for Big Important Service.

    Good thing it's managed by this template.

To accomplish this in -Y mode, yq carries extra metadata (mapping pairs and sequence values) in the JSON representation of your document for any custom tags or styles that it finds. When converting the JSON back into YAML, it parses this metadata, re-applies the tags and styles, and discards the extra pairs and values.

YAML comment metadata is attached to entries in mappings and sequences. Comments on a document whose root is a scalar (a string, number, boolean, or null) cannot currently roundtrip through -Y: there is no enclosing collection to carry their metadata through jq. For example, a Markdown heading after a YAML document separator is treated as a comment on a root string and is lost. Use --yaml-frontmatter/-F for these files to preserve the entire body.

YAML frontmatter

Use --yaml-frontmatter/-F to process a YAML header followed by Markdown or other text:

yq -Y --yaml-frontmatter '.draft = false' post.md
yq -iYF '.draft = false' post.md another-post.md

Only the first document is sent to jq. An initial --- opens the header; an unindented --- or ... document marker closes it. With -y or -Y, the closing delimiter and everything after it pass through unchanged, including comments, whitespace, and line endings. The filter must produce exactly one document, and each invocation accepts one input file (or multiple files with --in-place). A header without a closing delimiter is processed as ordinary YAML. Without -y/-Y, only the JSON query result is emitted, allowing queries such as yq -F .title post.md. The -f option still means jq’s --from-file.

XML support

yq also supports XML. The yq package installs an executable, xq, which transcodes XML to JSON using xmltodict and pipes it to jq. Roundtrip transcoding is available with the xq --xml-output/xq -x option. Multiple XML documents can be passed in separate files/streams as xq a.xml b.xml. Use --xml-item-depth to descend into large documents, streaming their contents without loading the full doc into memory (for example, stream a Wikipedia database dump with cat enwiki-*.xml.bz2 | bunzip2 | xq . --xml-item-depth=2). Entity expansion and DTD resolution is disabled to avoid XML parsing vulnerabilities. Use python -m yq.xq if you want to ensure a specific Python runtime.

TOML support

yq supports TOML as well. The yq package installs an executable, tomlq, which uses the tomlkit library to transcode TOML to JSON, then pipes it to jq. Roundtrip transcoding is available with the tomlq --toml-output/tomlq -t option. Use tomlq --toml-roundtrip/tomlq -T to preserve TOML comments, whitespace, and formatting metadata while editing. Use python -m yq.tomlq if you want to ensure a specific Python runtime.

Authors

  • Andrey Kislyuk

License

Licensed under the terms of the Apache License, Version 2.0.

Release files for yq 4.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for yq 4.2.0
File Size Uploaded
yq-4.2.0.tar.gz 38.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for yq 4.2.0
File Interpreter ABI Platform
yq-4.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 63.5 kB

Release files / yq-4.2.0.tar.gz

Download URL yq-4.2.0.tar.gz
Size 38.0 kB
Tags Source
SHA-256 checksum
How to use checksums
53854078bade13fd69eef85d77dcc513125a0bce2f8f1ef8b466e655ce1be9e6
BLAKE2b-256 checksum
How to use checksums
e15f212c5a30bb31e9c96bb89455b7c58213ef22f1a24e2497b743ef8092004d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / yq-4.2.0-py3-none-any.whl

Download URL yq-4.2.0-py3-none-any.whl
Size 25.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
818a45033517852f5768d02cb7a7f02d63d06f971ef2c8d6c2641f0f81a2e31f
BLAKE2b-256 checksum
How to use checksums
c1209ec3efc01c96576046f8651e9edf95e22731f02d06b2e9b5490e95ae91f7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release history Release notifications | RSS feed

4.3.0

2 release files

This release

4.2.0 This release

2 release files

4.1.2

2 release files

4.1.1

2 release files

4.1.0

2 release files

4.0.0

2 release files

3.4.3

2 release files

3.4.2

2 release files

3.4.1

2 release files

3.4.0

2 release files

3.3.1

2 release files

3.3.0

2 release files

3.2.3

2 release files

3.2.2

2 release files

3.2.1

2 release files

3.2.0

2 release files

3.1.1

2 release files

3.1.0

2 release files

3.0.2

2 release files

3.0.1

2 release files

2.14.0

2 release files

2.12.2

2 release files

2.12.1

2 release files

2.11.1

2 release files

2.10.1

2 release files

2.10.0

2 release files

2.9.2

2 release files

2.8.1

2 release files

2.8.0

2 release files

2.7.2

2 release files

2.7.1

2 release files

2.7.0

2 release files

2.6.0

2 release files

2.5.0

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.7

2 release files

2.3.6

2 release files

2.3.5

2 release files

2.3.4

2 release files

2.3.3

2 release files

2.3.2

2 release files

2.3.1

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.2

2 release files

2.1.1

2 release files

2.0.2

2 release files

2.0.1

2 release files

2.0.0

2 release files

0.0.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page