• 读取csv遇到的双循环


    读取csv文件且用到for的双层循环

    在最近读取一个百万级数据量的csv文件时,为了对其进行数据的整合,用到了双层循环,但是结果差强人意,除了第一批数据可以正常处理,剩下的读取不到,经过测试发现了问题

    一丶发现问题

    为了方便的处理数据,首先对数据进行了预处理,提取出id

    id_union = [776001, 776002, 776003, 776004, 776005, 776006, 776007, 776008, 776009, 776013, 776016, 776018, 776021,776030, 776031, 776032, 776033, 776034, 776035, 776999]
    

    读取数据及双循环处理

    with open('model_3.csv', 'r') as f:
        initial_data = csv.reader(f)
        lv_ranks = {}
        for node_id in id_union:
            lv_ranks['lv_' + str(node_id)] = []
            for i in initial_data:
                if i[5] == str(node_id):
                    lv_ranks['lv_' + str(node_id)].append(float(i[6]))
    
        # print(lv_ranks)
    

    上面的打印结果除了第一个id的key是有value的,后面的均为空,为什么会出现问题,完全找不到头绪,首先双层循环不存在死循环,不存在字典重置,其次我将双层循环改成单层循环,数据均能正确的拿出,说明if判断没有问题,陷入了一个两难的局面,百度也没有找到想要的答案

    二丶尝试解决

    这个问题说到底就是两个列表的遍历,由于数据量较大,在运行发现的问题难以得到处理,于是我将两个列表精简到最简,并重现了双层循环的过程

    a = ["1", "2", "3", "4", "5"]
    
    b = [(1, "1"), (2, "2"), (3, "3"), (4, "4"), (5, "5")]
    
    c = {}
    for i in a:
        c[i] = []
        for j in b:
            if j[1] == i:
                c[i].append(j[0])
    
    print(c)
    

    上面的这个代码段打印的结果与预期相同,于是我隐约猜到了出现问题的原因,接着进行了尝试

    with open('model_3_预测1月.csv', 'r') as f:
        initial_data = csv.reader(f)
        
        initial_data = list(initial_data)
    
        lv_ranks = {}
        for node_id in id_union:
            lv_ranks['lv_' + str(node_id)] = []
            for i in initial_data:
                if i[5] == str(node_id):
                    lv_ranks['lv_' + str(node_id)].append(float(i[6]))
    
        # print(lv_ranks)
    

    上述我将读取到的csv结果,转化成了list列表,果真解决了问题,此时我还不知道原因

    三丶问题总结

    这里涉及到类型转换,说明读取到的csv文件的结果并不是list类型,但一定是可迭代类型,打印了下csv读取结果的数据类型


    显而易见并不是list类型的数据,但遍历时,每一行数据又是一个列表,列表中每一个数据又以字符串的类型存在,在这个问题里,需要将其转化成list类型,以完成双层循环。

    对于为什么要这么操作,我没搞明白,应该是因为csv的数据类型不能进行二次循环,或者进入循环读取时数据类型与之前不一致,经过几个小时的纠结,也算是解决了问题

  • 相关阅读:
    Roads in the North
    Labyrinth
    英语写作(二)
    语法长难句笔记
    英语写作(一)
    MySQL笔记(二)
    MySQL笔记(一)
    Mybatis简单使用与配置
    Mybatis映射文件
    什么是serializable接口?
  • 原文地址:https://www.cnblogs.com/Zhao01/p/12660368.html
Copyright © 2020-2023  润新知