CSV文件中的Jinja中的变量列表

时间:2019-07-01 19:05:27

标签: python csv jinja2

我需要从CSV文件中打印jinja2模板中所有具有相同列名的项目

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 个答案:

答案 0 :(得分:1)

我可以建议使用字典的简单,优雅和灵活的方法,该字典可以将值存储为重复键的列表。有关此类字典类,请参见this SO answer。但是此类的实现可能有所不同,我不坚持认为这是最好的。

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

答案 1 :(得分:0)

您需要这样的东西

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