Пользовательский фильтр Jinja с использованием Python Pandas возвращается только иногда, возвращая правильную информациюPython

Программы на Python
Ответить
Anonymous
 Пользовательский фильтр Jinja с использованием Python Pandas возвращается только иногда, возвращая правильную информацию

Сообщение 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 %}


Подробнее здесь: https://stackoverflow.com/questions/793 ... turning-co
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»