如何导入csv作为嵌套字典?

时间:2019-11-06 01:07:03

标签: python csv

我有一些看起来像这样的数据:

Benchmark   Workload    Stat1   Stat2
foo         input1      1%      2%
bar         input2      3%      4%

除了它更大,具有更多基准测试,更多工作负载和更多统计信息之外,因此很难对涉及提前知道可能值的任何事物进行硬编码。

有没有一种简便的方法可以将所有这些导入到python dict中,以便可以执行以下操作: stats [基准] [工作量] ['stat1']

2 个答案:

答案 0 :(得分:0)

以下代码可能对您有用:

import sys
import pathlib

def import_data_from_file(path):
    p = pathlib.Path(path)
    root = dict()
    with open(p , mode = "r") as inf:
        it_inf = iter(inf)
        col_heads = next(it_inf)
        for row in it_inf:
            row = row.strip()
            row = row.split(" ")
            predicate = lambda x: len(x) > 0
            row = list(filter(predicate, row))
            d = root
            benchmark = row[0]
            workload = row[1]
            root.setdefault(benchmark, dict())
            root[benchmark].setdefault(workload, dict())
            root[benchmark][workload] = row[2:]
    return (col_heads, root)

def pprint_data(d, *, sep="", file=sys.stdout):
    _print = lambda *args:\
        print(*args, sep=sep, file=file)
    for benchmark in d.keys():
        _print(benchmark)
        for workload in d[benchmark].keys():
            _print(4 * " ", workload)
            _print(8 * " ", d[benchmark][workload])
    return

col_heads, root = import_data_from_file("dfgdfgdfg.csv")
pprint_data(root)

控制台输出为:

foo
    input1
        ['1%', '2%']
bar
    input2
        ['3%', '4%']

答案 1 :(得分:0)

使用Pandas library有一个更简单的解决方案:

import pandas as pd
stats = pd.DataFrame(columns=['Benchmark', 'Workload', 'Stat1', 'Stat2'])
stats.Benchmark = ['foo', 'bar']
stats.Workload = ['input1', 'input2']
stats.Stat1 = ['1%', '3%']
stats.Stat2 = ['2%', '4%']

如果现在打印出数据框(stats),它将看起来像这样:

enter image description here

这样做比制作嵌套词典(如您所要求的)的优势在于,与其通过写下stats[benchmark][workload]['stat1']之类的所有列来访问数据,还可以仅使用列名和索引来访问元素元素,例如:

df.Benchmark[1]
>>> 'bar'

df.Workload[0]
>>> 'input1'

df.Stat1[0]
>>> '1%'

df.Stat2[1]
>>> '4%'

您可以像这样将CSV导入熊猫数据框:

import pandas as pd
data = pd.read_csv('path/to/file.csv')