代码之家  ›  专栏  ›  技术社区  ›  user8188120

仅在某些行中读取csv.dictreader

  •  1
  • user8188120  · 技术社区  · 6 年前

    在python中使用csv.dictreader函数时,是否有方法读取.csv文件的某些行?

    例如,如果只想加载.csv文件的第10-20行 不在整个数据集中加载 第一。

    我有几个.csv文件,每个文件有2亿行,包含10个字段名数据条目-因此我使用的是dictreader,而不是简单的csv.read()。

    下面是我当前方法的一个简单示例:

    import csv
    from tqdm import tqdm
    
    field_names = ['A','B','C']
    
    IDs = []
    with open(file_1) as f:
        reader = csv.DictReader(f,field_names,delimiter=',')
        row_count = 0
        for row in tqdm(reader): 
            row_count+=1
            ID = row['A']
            if ID not in IDs == True: 
            IDs.append(ID)
    

    您可以看到,对于2亿行的迭代来说,这会很慢,而且循环中的任何进一步条件或处理都会大大减慢它的速度。

    因此,遍历一组行,然后对它们进行多线程处理以节省时间是有意义的。

    我考虑过的事情:

    • 使用pandas csv读取例程(您仍然需要在 开始时的整个数据集)
    • 像在我的示例中那样遍历行 代码,记录行数,然后在多线程中重新加载行 批次。
    • 使用生成器而不是迭代器(如 ThreadPool and Pool for parallel processing )

    多谢提前!

    1 回复  |  直到 6 年前
        1
  •  0
  •   blhsing    6 年前

    你可以使用 enumerate 生成行索引,以及 break 索引到达目标时的循环:

    IDs = set()
    for i, row in enumerate(reader):
        if i > 9:
            IDs.add(row['A'])
        elif i > 19:
            break
    

    注意,你可以 IDs 一个集合,而不是一个列表,以便更有效地获取唯一的id。