Список переменных в jinja из файла csv - PullRequest
1 голос
/ 01 июля 2019

Мне нужно напечатать все элементы с одинаковыми именами столбцов в шаблоне jinja2 из CSV-файла

CSV-файл:

some1,letter,letter,letter,letter,some2
1,f,r,o,g,z
q,s,u,n,,a
a,f,a,c,e,q
z,n,a,n,o,1

Я пытался использовать этот шаблон jinj2:

{% for item in letter %}{{ item }}{% endfor %}

и результат:

g

e
o

(только элемент из последнего "столбца" в csv)

но мне нужно:

frog
sun
face
nano

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Я могу предложить простой, элегантный и гибкий способ сделать это с помощью словаря, который может хранить значения в виде списка для дубликатов ключей.См. этот SO-ответ для такого словарного класса.Но реализация этого класса может отличаться, я не настаиваю на том, чтобы этот класс был лучшим.

import csv
import os
from itertools import groupby

class DictList(dict):
    def __init__(self, iterable, **kwargs):
        super(DictList, self).__init__()
        for k, v in iterable:
            self[k] = v
        self.update(**kwargs)

    def __setitem__(self, key, value):
        try:
            # Assumes there is a list on the key
            self[key].append(value) 
        except KeyError: # if fails because there is no key
            super(DictList, self).__setitem__(key, value)
        except AttributeError: # if fails because it is not a list
            super(DictList, self).__setitem__(key, [self[key], value])


with open('test.csv') as csv_file:
    reader = csv.reader(csv_file, delimiter=',')
    header = next(reader)

    for row in reader:
        variables = DictList(zip(header, row))

Это выводит:

{'some1': '1', 'letter': ['f', 'r', 'o', 'g'], 'some2': 'z'}
{'some1': 'q', 'letter': ['s', 'u', 'n', ''], 'some2': 'a'}
{'some1': 'a', 'letter': ['f', 'a', 'c', 'e'], 'some2': 'q'}
{'some1': 'z', 'letter': ['n', 'a', 'n', 'o'], 'some2': '1'}
0 голосов
/ 01 июля 2019

Вам нужно что-то вроде этого

import csv

with open('test.csv') as csv_file:
    data_lst = list(csv.reader(csv_file, delimiter=','))
    items = []
    data_without_header = data_lst[1:]
    for row in data_without_header:
        items.append("".join(row))

Используйте это в jinja

{% for item in items %}{{ item }}{% endfor %}

Это будет отображаться так

frog
sun
face
nano
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...