Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用动态密钥数python解析csv_Python - Fatal编程技术网

使用动态密钥数python解析csv

使用动态密钥数python解析csv,python,Python,我正在编写一个脚本,该脚本从csv读取数据,并将其放入dict。我的数据如下: firstName lastName skill alice sparks artist mark peters sports bob stones teacher Chelsea chester sports {'firstName': ['alice', 'mark', 'bob'], '

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

firstName    lastName    skill
alice        sparks      artist
mark         peters      sports
bob          stones      teacher
Chelsea
chester                  sports
{'firstName': ['alice', 'mark', 'bob'], 'lastName': ['sparks', 'peters', 'stones'], 'skill': ['artist', 'sports', 'teacher']}
以此类推,数据是一个
csv
,这意味着在上面的示例中,空格实际上是逗号

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

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

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

    我在线搜索了所有得到基于行的结果的地方,但我需要按列搜索,并将其放入数组中。

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

    代码: 输出:
    DictReader()
    (标题,行[i])
    的形式返回一个
    OrderedDictionary
    数组,它是用例的完美前言。您所需要的只是一个默认项类型为
    list
    的条件,并在遍历每一行时将
    附加到列表中。

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

    代码: 输出:
    DictReader()
    (标题,行[i])
    的形式返回一个
    OrderedDictionary
    数组,它是用例的完美前言。您所需要的只是一个默认项类型为
    list
    append
    的条件,在您遍历每一行时将其添加到列表中。

    您也可以使用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")
    

    希望这对您有所帮助:)

    您也可以使用熊猫:

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

    希望这有帮助:)

    一个选项是使用熊猫数据帧的方法:


    一个选项是使用数据帧的方法:


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

    代码:

    输出:


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

    代码:

    输出:


    在标题的
    行中抛出一个错误,行中的项。items():
    说明
    属性错误:“行”对象没有属性“项”
    您使用了
    行还是
    行?您的语句显示了
    line.items()
    ,但错误是针对
    行的。如果要重命名变量,请确保按照我的示例进行一致重构。迭代应该只有2级,第一级是迭代抛出
    s,第二级是迭代遍历
    OrderedDictionary
    项。在错误对象上尝试使用
    type()
    ,以确保所需的对象类型正确。是的,我将其重命名为
    line
    ,而不是
    row
    粘贴时忘记交换代码行中的名称,尽管在错误消息中对其进行了更改。很抱歉,您仍然遇到相同的错误吗?什么是
    类型(行)
    为您返回的?它是在您的实现中失败的,还是在您的用例下的我的最小示例中失败的?如果还没有,请先在您的
    csv
    文件上尝试我的最小示例。它也适用于您提供的新数据集-我已经用结果更新了答案。它也可能源于您的
    csv
    文件。在标题的行
    ,行中的项中抛出一个错误。items():
    声明
    AttributeError:“行”对象没有属性“项”
    是否使用了
    ?您的语句显示了
    line.items()
    ,但错误是针对
    行的。如果要重命名变量,请确保按照我的示例进行一致重构。迭代应该只有2级,第一级是迭代抛出
    s,第二级是迭代遍历
    OrderedDictionary
    项。在错误对象上尝试使用
    type()
    ,以确保所需的对象类型正确。是的,我将其重命名为
    line
    ,而不是
    row
    粘贴时忘记交换代码行中的名称,尽管在错误消息中对其进行了更改。很抱歉,您仍然遇到相同的错误吗?什么是
    类型(行)
    为您返回的?它是在您的实现中失败的,还是在您的用例下的我的最小示例中失败的?如果还没有,请先在您的
    csv
    文件上尝试我的最小示例。它也适用于您提供的新数据集-我已经用结果更新了答案。它也可能来自您的
    csv
    文件。
    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']}