用动态数量的键python解析csv

时间:2018-01-31 17:44:59

标签: python

我正在处理一个脚本,该脚本从csv读取数据并将其放入dict。我的数据如下:

firstName    lastName    skill
alice        sparks      artist
mark         peters      sports
bob          stones      teacher
Chelsea
chester                  sports

等等,数据是csv,这意味着在上面的示例中,空格实际上是逗号。

我想将这些数据解析为csv列,最终的dict必须如下所示:

{'firstName': ['alice', 'mark', 'bob'], 'lastName': ['sparks', 'peters', 'stones'], 'skill': ['artist', 'sports', 'teacher']}

理论上:

  1. 第一行成为dict中的键
  2. 该特定列中的其他行成为值数组
  3. 键数可能在2-40之间变化,因此如果可能,它应该是动态的(自动检测)。
  4. 与示例一样,与其他列相比,列的条目可能更少
  5. 在python中可以这样吗?

    我在网上搜索我得到的基于行的结果,但是我需要列明智而且需要在数组中。

4 个答案:

答案 0 :(得分:1)

使用csv.DictReader()dictionary.setdefault()

代码:

csvf = csv.DictReader(open("test.csv","r"))

d = {}
for row in csvf:
    for header, item in row.items():
        d.setdefault(header, []).append(item)

输出:

{'firstName': ['alice', 'mark', 'bob', 'Chelsea', 'chester'],
 'lastName': ['sparks', 'peters', 'stones', '', ''],
 'skill': ['artist', 'sports', 'teacher', '', 'sports']}

DictReader()OrderedDictionary的形式返回(header, row[i])的数组,这是您的用例的完美序言。当您遍历每一行时,您所需要的只是一个Dcitionary,默认项类型listappend到列表中。

答案 1 :(得分:1)

一种选择是使用pandas DataFrame的to_dict方法:

import pandas as pd

df = pd.read_csv('test.csv')
d = df.to_dict('list')

答案 2 :(得分:0)

您也可以使用pandas:

# Convert DataFrame to Dictionary 
df_dict = df.to_dict()

# Now convert it to list of values 
for key,value in df_dict:
df_dict[key] = [value for key,value in df_dict[key].items()]

# Or you can directly use:
df_dict = df.to_dict("list")

希望这会有所帮助:)

答案 3 :(得分:0)

此代码还将满足您的所有条件,包括重复项和空值。

<强> 代码:

if __name__ == '__main__':
    d = {}
    a = []
    with open('sample.csv', 'r') as readf:
        enum_list = [line.rstrip('\n').split(',') for line in readf]
        for i,x in enumerate(enum_list):
            if i == 0:
                for val in x:
                    d[val] = []
                    a.append(val)
                continue
            for val in x:
                i = x.index(val)
                if val and val not in d[a[i]]:
                    d[a[i]].append(val)
    print(d)

<强> 输出:

{'first_name': ['alice', 'mark', 'bob', 'Chelsea', 'chester'], 'last_name': ['sparks', 'peters', 'stones'], 'skill': ['artist', 'sports', 'teacher']}