Я создаю сайт с темой Material для MkDocs. Я добавил следующий пользовательский фильтр:
import pandas
def csv_to_html(csv_path):
return pandas.read_csv(csv_path).to_html()
Я пытаюсь найти файл CSV на основе метаданных моего документа MD. Вот мой документ(doc_12345.md) выглядит так:
---
title: myDocument
doc_number: doc_12345
---
Я хочу проанализировать файл doc_12345.csv. Фильтры Jinja, похоже, действуют очень хаотично. У меня несколько разных проблем:
Первая проблема
Фильтр работает только в том случае, если я использую канал (|). Это не удается:
{{ csv_to_html("data/doc_12345.csv") }}
Ошибка:
jinja2.Exceptions.UnifiedError: значение 'csv_to_html' не определено
Это работает:
{{ "data/doc_12345.csv" | csv_to_html }}
Вторая проблема
Метаданные страницы встречаются только в некоторых ситуациях, а не в других. Ссылаясь на эту документацию, я получаю доступ к атрибуту doc_number с помощью page.meta.doc_number. Использование его отдельно, похоже, работает, см. примеры ниже:
{{ page.meta }}
# { 'title': 'myDocument', 'doc_number': 'doc_12345' }
{{ page.meta.doc_number }}
# doc_12345
Но объединение строк этого не дает:
{{ "data/" + page.meta.doc_number + ".csv" }}
jinja2.Exceptions.UndefineError: «объект dict» не имеет атрибута «doc_number»
Как ни странно, если я использую default(), он сможет найти атрибут doc_number:
{{ "data/" + (page.meta.doc_number | default("random text")) + ".csv" }}
# data/doc_12345.csv
Почему он будет работать, если его отправить в фильтр, а не сам по себе?
Третья проблема
Один раз Я передаю это значение в свой фильтр csv_to_html, номер документа исчезает:
{{ "data/" + (page.meta.doc_number | default("random text")) + ".csv" | csv_to_html }}
FileNotFoundError: [Errno 2] Нет такого файла или каталога: 'data/.csv'
Я также попробовал установить его как переменную:
{% set csv_path = "data/" + (page.meta.doc_number | default("random text")) + ".csv" %}
{{ csv_path }}
# data/doc_12345.csv
{{ csv_path | csv_to_html }}
# FileNotFoundError: [Errno 2] No such file or directory: 'data/.csv'
Что еще более странно, если я изменю csv_to_html, чтобы просто вернуть ввод, путь будет в порядке:
import pandas
def csv_to_html(csv_path):
return csv_path
{{ csv_path | csv_to_html }}
# data/doc_12345.csv
Таким образом, строка csv_path работает нормально, пока не дойдет до pandas.read_csv(), но с ней только возникают проблемы, если она был собран с использованием page.meta.doc_number. Когда я передаю строковый литерал "data/doc_12345.csv" в csv_to_html, он прекрасно преобразует CSV в HTML.
Для меня это не имеет смысла что угодно. Что здесь происходит?
Отредактируйте, чтобы добавить минимально воспроизводимый пример:
mkdocs.yml
theme:
name: material
custom_dir: templates
plugins:
- mkdocs-simple-hooks:
hooks:
on_env: "modules.hooks:on_env"
modules/hooks.py
import pandas
def csv_to_html(csv_path):
return pandas.read_csv(csv_path).to_html(index=False)
def on_env(env, config, **kwargs):
# Add the filters
env.filters['csv_to_html'] = csv_to_html
data/doc_12345.csv
ColumnA,ColumnB,ColumnC
ValueA,ValueB,ValueC
docs/doc_12345.md
---
title: myDocument
doc_number: doc_12345
---
# Hello world
templates/main.html
{% extends "base.html" %}
{% block content %}
{{ ("data/" + page.meta.doc_number + ".csv") | csv_to_html }}
{{ page.content }}
{% endblock %}
Подробнее здесь: https://stackoverflow.com/questions/793 ... turning-co
Пользовательский фильтр Jinja с использованием Python Pandas возвращается только иногда, возвращая правильную информацию ⇐ Python
Программы на Python
1735937657
Anonymous
Я создаю сайт с темой Material для MkDocs. Я добавил следующий пользовательский фильтр:
import pandas
def csv_to_html(csv_path):
return pandas.read_csv(csv_path).to_html()
Я пытаюсь найти файл CSV на основе метаданных моего документа MD. Вот мой документ(doc_12345.md) выглядит так:
---
title: myDocument
doc_number: doc_12345
---
Я хочу проанализировать файл doc_12345.csv. Фильтры Jinja, похоже, действуют очень хаотично. У меня несколько разных проблем:
Первая проблема
Фильтр работает только в том случае, если я использую канал (|). Это не удается:
{{ csv_to_html("data/doc_12345.csv") }}
Ошибка:
jinja2.Exceptions.UnifiedError: значение 'csv_to_html' не определено
Это работает:
{{ "data/doc_12345.csv" | csv_to_html }}
Вторая проблема
Метаданные страницы встречаются только в некоторых ситуациях, а не в других. Ссылаясь на эту документацию, я получаю доступ к атрибуту doc_number с помощью page.meta.doc_number. Использование его отдельно, похоже, работает, см. примеры ниже:
{{ page.meta }}
# { 'title': 'myDocument', 'doc_number': 'doc_12345' }
{{ page.meta.doc_number }}
# doc_12345
Но объединение строк этого не дает:
{{ "data/" + page.meta.doc_number + ".csv" }}
jinja2.Exceptions.UndefineError: «объект dict» не имеет атрибута «doc_number»
Как ни странно, если я использую default(), он сможет найти атрибут doc_number:
{{ "data/" + (page.meta.doc_number | default("random text")) + ".csv" }}
# data/doc_12345.csv
Почему он будет работать, если его отправить в фильтр, а не сам по себе?
Третья проблема
Один раз Я передаю это значение в свой фильтр csv_to_html, номер документа исчезает:
{{ "data/" + (page.meta.doc_number | default("random text")) + ".csv" | csv_to_html }}
FileNotFoundError: [Errno 2] Нет такого файла или каталога: 'data/.csv'
Я также попробовал установить его как переменную:
{% set csv_path = "data/" + (page.meta.doc_number | default("random text")) + ".csv" %}
{{ csv_path }}
# data/doc_12345.csv
{{ csv_path | csv_to_html }}
# FileNotFoundError: [Errno 2] No such file or directory: 'data/.csv'
Что еще более странно, если я изменю csv_to_html, чтобы просто вернуть ввод, путь будет в порядке:
import pandas
def csv_to_html(csv_path):
return csv_path
{{ csv_path | csv_to_html }}
# data/doc_12345.csv
Таким образом, строка csv_path работает нормально, пока не дойдет до pandas.read_csv(), но с ней только возникают проблемы, если она был собран с использованием page.meta.doc_number. Когда я передаю строковый литерал "data/doc_12345.csv" в csv_to_html, он прекрасно преобразует CSV в HTML.
Для меня это не имеет смысла что угодно. Что здесь происходит?
Отредактируйте, чтобы добавить минимально воспроизводимый пример:
mkdocs.yml
theme:
name: material
custom_dir: templates
plugins:
- mkdocs-simple-hooks:
hooks:
on_env: "modules.hooks:on_env"
modules/hooks.py
import pandas
def csv_to_html(csv_path):
return pandas.read_csv(csv_path).to_html(index=False)
def on_env(env, config, **kwargs):
# Add the filters
env.filters['csv_to_html'] = csv_to_html
data/doc_12345.csv
ColumnA,ColumnB,ColumnC
ValueA,ValueB,ValueC
docs/doc_12345.md
---
title: myDocument
doc_number: doc_12345
---
# Hello world
templates/main.html
{% extends "base.html" %}
{% block content %}
{{ ("data/" + page.meta.doc_number + ".csv") | csv_to_html }}
{{ page.content }}
{% endblock %}
Подробнее здесь: [url]https://stackoverflow.com/questions/79325277/custom-jinja-filter-using-python-pandas-is-returning-only-sometimes-returning-co[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия