代码之家  ›  专栏  ›  技术社区  ›  Shan-Desai askovpen

对于大型数据集,使用Python3.x获取每100行CSV文件直到EOF

  •  1
  • Shan-Desai askovpen  · 技术社区  · 4 年前

    我有一个CSV格式的大型数据集,其结构如下:

    time,value,id,value2,value3
    2002141150250586,23.034,101,35.93,34.39
    .
    .
    2002141150250586,24.349,2,24.45,67.99
    

    在调查档案时,我发现有一批 100 相同时间戳的数据点,按id降序排列(从101到2)。

    我最初能够使用以下代码获取前100个数据:

    import csv
    import datetime
    import itertools
    
    def main():
        with open('myfile.csv','r',encoding='utf-8-sig') as csv_file:
            csv_reader = csv.DictReader(csv_file)
            for row in itertools.isslice(csv_reader, 0, 100):
                ID = row['id']
                timestamp = datetime.datetime.strptime(row['time'], ""%y%m%d%H%M%S%f")
                print(f'{ID}: {ts}')
    
    

    id (从101到2)。

    如何继续获取后续批次(每100个数据点)直到 EOF 既然文件很大?

    1 回复  |  直到 4 年前
        1
  •  2
  •   log0    4 年前

    您可以使用以下分组函数将行成批分组为100行:

    from itertools import chain, islice
    
    def grouper(iterable, n):
      "grouper(ABCDE,2) => AB CD E"
      iterable = iter(iterable)
      while True:
        yield chain([next(iterable)], islice(iterable, n-1))
    

    csv_reader = csv.DictReader(csv_file)
    for group in grouper(csv_reader, 100):
      for row in group:
        ...
    

    grouper函数在内存中最多存储一行。

    如果批次不总是100行,则稍微更新。在这种情况下,我们只对具有相同时间戳的后续行进行分组:

    csv_reader = csv.DictReader(csv_file)
    for key, group in itertools.groupby(csv_reader, lambda row: row['time']):
      for row in group:
        ...