Install & Compatibility
Where this runs
tested against v5.19.0 · pip install
no network on importno background threads
Install × environment matrix
Each cell = how many times install + import succeeded across repeated harness runs. Partial = flaky.
glibc = Debian/Ubuntu slim · musl = Alpine Linux
muslpy 3.10–3.915 runs
installs and imports cleanly · install 0.0s · import 0.919s · 91.5MB
glibcpy 3.10–3.915 runs
installs and imports cleanly · install 11.2s · import 0.843s · 92MB
88MB installed
● package 88MB
Code
Verified usage
Verified import paths — ran on the pinned version, not inferred.
describe
✓ from frictionless import describe
extract
✓ from frictionless import extract
validate
✓ from frictionless import validate
Package
✓ from frictionless import Package
✗ import frictionless.package
Top-level functions and classes are directly exposed under the `frictionless` namespace for ease of use.
This quickstart demonstrates how to use `frictionless` to infer metadata (schema) from a CSV file and then extract its data as Python rows. It first creates a temporary CSV file, then uses `describe` to automatically generate a schema, and `extract` to read the data.
import os
from frictionless import describe, extract
# Create a dummy CSV file for demonstration
csv_content = """id,name,value
1,apple,100
2,banana,200
3,orange,150
"""
file_path = "data.csv"
with open(file_path, "w") as f:
f.write(csv_content)
# Describe the data to infer metadata (Table Schema)
print("--- Inferred Schema ---")
report = describe(file_path)
print(report.to_json(indent=2))
# Extract data as rows from the file
print("\n--- Extracted Data ---")
rows = extract(file_path)
for row in rows:
print(row)
# Clean up the dummy file
os.remove(file_path)
frictionless --version
Debug
Known issues
breakingFrictionless Framework v5, released in December 2022, introduced several low-level breaking changes compared to v4. Users migrating from v4 or earlier should consult the official v5 announcement and migration guide for a smooth transition.fixReview the official Frictionless v5 migration guide and update your code to reflect the new API where necessary.
affects: 5.x.x (from 4.x.x)
gotchaSupport for certain data formats or schemes (e.g., SQL databases, Pandas DataFrames, HTML, Parquet) requires installing additional plugins (e.g., `pip install frictionless[sql]`). Attempting to use these features without the corresponding plugin will result in an error message with installation instructions.fixInstall the necessary plugins using `pip install frictionless[plugin_name]` as indicated by the error message or documentation.
affects: All versions
gotchaArgument naming conventions differ across Frictionless interfaces: `snake_case` for Python arguments, `camelCase` for dictionary/JSON objects, and `dashes-case` for command-line interface arguments. Be mindful of these differences when moving between interfaces.fixAlways refer to the specific interface's documentation for correct argument naming. For Python, use `snake_case`. For JSON/dictionaries, use `camelCase`. For CLI, use `--dashed-arguments`.
affects: All versions
gotchaThe underlying Frictionless Data Package standard was updated to version 2.0 in June 2024. While `frictionless-py` aims for backward compatibility, new features or stricter adherence to the v2 spec might subtly change how data packages are processed or validated compared to older versions.fixFamiliarize yourself with the Data Package v2 specification, especially for defining custom data packages. Ensure your data package descriptors conform to the latest standard for optimal compatibility.
affects: 5.x.x (especially after June 2024)
Errors
Common errors & fixes
ModuleNotFoundError: No module named 'frictionless'
The 'frictionless' library is not installed in your Python environment or the environment where you are running your code.
fixInstall the library using pip: `pip install frictionless`
TypeError: Option() missing 1 required positional argument: 'default'
This error typically indicates a breaking change in the `frictionless` library's API, specifically concerning how `Option` objects are initialized, often due to an upgrade to a newer version (e.g., from an older 5.x version to >= 5.15.6).
fixReview the Frictionless documentation for your installed version to understand the updated `Option` constructor or downgrade to a compatible version: `pip install frictionless==5.15.5` if this version worked for you. It might also require updating the code that uses `Option` objects.
Type error in the cell "VALUE" in row "ROW_NUMBER" and field "FIELD_NAME": type is "EXPECTED_TYPE/DEFAULT_FORMAT"
This error occurs during data validation when a cell's value does not conform to the data type defined in the schema for that specific field. For example, a string value in a column expected to contain integers.
fixEither correct the data in the problematic cell to match the schema's type, or adjust the schema's field type to accurately reflect the data, or provide appropriate `missing_values` in your schema for cells that genuinely lack a value. You can inspect the validation report for details. Example to fix the data in Python: `report = frictionless.validate('your_data.csv', schema='your_schema.json')` invalid descriptor: 'path' is a required property
This error occurs when a descriptor (for a resource, package, or schema) is missing a required property, such as 'path', or has an incorrect structure, making it invalid according to the Frictionless Data Package specifications.
fixEnsure your descriptor (e.g., `resource.json`, `package.json`, or a dictionary/object used to create one) includes all mandatory fields. For a Resource, 'path' is typically required. Example: `resource = frictionless.Resource({'path': 'data.csv'})` or `package = frictionless.Package({'resources': [{'path': 'data.csv'}]})` AttributeError: 'Table' object has no attribute 'schema'
This `AttributeError` can occur if you are trying to access `.schema` directly on a `Table` object, while the schema might be accessed differently or might not be directly available as an attribute on `Table` in your specific use case or version of Frictionless. The `Table` object primarily provides access to data, while `Resource` objects are typically associated with schemas.
fixIf you are working with a `Resource` object, access the schema via `resource.schema`. If you only have a `Table` object (e.g., from `resource.to_table()`), you might need to infer the schema using `table.infer()`, or pass a `schema` to the `Resource` that created the table. Example: `resource = frictionless.Resource('data.csv'); schema = resource.schema` or `report = frictionless.validate('data.csv'); print(report.tasks[0].schema)` to get the inferred/validated schema. Upgrade
Version history
5.19.0latest on PyPI · released Apr 13, 2026
Audit
Dependencies
PyGithuboptionalUsed for GitHub integration functionalities (e.g., reading/publishing packages to GitHub repositories).
SQLAlchemyoptionalRequired for SQL database connectivity. Installed via `frictionless[sql]`.
pandasoptionalRequired for Pandas DataFrame integration. Installed via `frictionless[pandas]`.