1

I need to print all items with identical names of columns in jinja2 template from csv file

csv file:

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

i tried to use this jinj2 template:

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

and result:

g

e
o

(only item from last "column" in csv)

but i need:

frog
sun
face
nano
rasmer
  • 33
  • 6

2 Answers2

1

I can suggest easy, elegant and flexible way to do this is with the help of the dictionary that can store values as a list for duplicate keys. See this SO answer for such dictionary class. But implementation of this class can be different, I don't insist that this one is the best.

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))

This outputs:

{'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

You need something like this

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))

Use this in jinja

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

It would be displayed like this

frog
sun
face
nano
Rahim
  • 146
  • 1
  • 8
  • thank you for your answer! but i need to use jinja template. csv may see like: a,b,c,d,e,f,letter,letter,letter,letter,z,x,g,h,i,j,k,l,m,n,o – rasmer Jul 01 '19 at 19:46
  • you can use the *items* variable in jinja template. – Rahim Jul 01 '19 at 19:51
  • your code do not work with csv like this: abrakadabra,letter,letter,letter,letter,some 1,f,r,o,g,h 5,s,u,n,,j g,f,a,c,e,l j,n,a,n,o,6 – rasmer Jul 01 '19 at 20:04