【问题标题】:csv.DictReader only read in certain rowscsv.DictReader 仅读取某些行
【发布时间】:2018-11-16 15:20:50
【问题描述】:

在 Python 中使用 csv.DictReader 函数时,是否可以读取 .csv 文件的某些行?

例如,如果您只想加载 .csv 文件的第 10-20 行而不首先加载整个数据集

我有几个 .csv 文件,每个文件有 2 亿行,包含 10 个 field_name 数据条目 - 因此我使用 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

非常感谢!

【问题讨论】:

    标签: python multithreading csv dictionary


    【解决方案1】:

    您可以使用enumerate 生成行索引,并在索引到达目标时使用break 循环:

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

    请注意,您可以将IDs 设为集合而不是列表,以提高获取唯一 ID 的效率。

    【讨论】:

    • 感谢您的回复!我假设此方法仍会遍历较低的行以到达您想要的行范围?我可以看到这是一个问题,如果这有意义的话,必须遍历 90% 的数据集才能达到最后的 10 行
    • 附带说明,我已经实现了您使用集合而不是附加到列表的想法 - 谢谢!
    • 很高兴能提供帮助。是的,阅读下面的行是必须的,因为没有其他方法可以计算行数,每行都以换行符结尾,而无需实际读取每个字符。当您的目标行接近文件开头时,我向您展示的内容至少仍然会有所帮助。
    • 这是有道理的..我想这意味着没有办法解决:1.逐行遍历数据集但不存储在内存中或2.加载整个数据集,然后选择行凭记忆
    • 对。不过,选项 1 肯定更可取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多