csv 遍历字典,每次5行

piztneat  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(116)

我尝试用csv.DictReader打开一个csv文件,只读入前5行数据,执行我脚本的主要过程,然后读入下5行并对它们执行相同的操作。
我相信我有一个有效的方法,但我有问题的最后一行数据不处理。我知道我需要修改我的if语句,使它也检查我是否在文件的末尾,但我有困难找到一种方法来做到这一点。我已经找到了方法在线,但它们涉及阅读整个文件以获得行计数,但这样做会破坏此脚本的目的,因为我正在处理内存问题。
以下是我到目前为止所做的:

import csv
count = 0
data = []
with open('test.csv') as file:
    reader = csv.DictReader(file)
    
    for row in reader:
        count +=1
        data.append(row)

        if count % 5 == 0 or #something to check for the end of the file:
            #do stuff
            data = []

字符串
谢谢你的帮助!

3zwtqj6y

3zwtqj6y1#

阅读csv时可以使用chunksize参数。这将逐步读取行数:

import pandas as pd
reader = pd.read_csv('test.csv', chunksize=5)
for df in reader:
    # do stuff

字符串

ny6fqffe

ny6fqffe2#

您可以处理for循环体之后的其余行。您也可以使用更pythonic的enumerate

import csv

data = []
with open('test.csv') as file:
    reader = csv.DictReader(file)
    for count, row in enumerate(reader, 1):
        data.append(row)
        if count % 5 == 0:
            # do stuff
            data = []

    print('handling remaining lines at end of file')
    print(data)

字符串
考虑到文件

a,b
1,1
2,2
3,3
4,4
5,5
6,6
7,7


输出

handling remaining lines at end of file
[OrderedDict([('a', '6'), ('b', '6')]), OrderedDict([('a', '7'), ('b', '7')])]

3zwtqj6y

3zwtqj6y3#

这是一种使用迭代器的方法

例如:

import csv

with open('test.csv') as file:
    reader = csv.DictReader(file)
    
    value = True
    while value:
        data = []
        for _ in range(5):             # Get 5 rows
            value = next(reader, False) 
            if value:
                data.append(value)
        print(data)   #List of 5 elements

字符串

tpgth1q7

tpgth1q74#

保持沿着你所写的路线,不包括任何其他进口:

import csv
data = []
with open('test.csv') as file:
    reader = csv.DictReader(file)

    for row in reader:
        data.append(row)
        if len(data) > 5:
            del data[0]
        if len(data) == 5:
            # Do something with the 5 elements
            print(data)

字符串
if语句允许数组在开始处理之前加载5个元素。

class ZeroIterNumberException(Exception):
    pass
class IterN:
    def __init__(self, iterator, n):
        if n<1:
            raise ZeroIterNumberException("{} is not a valid number of rows.".format(n))
        self.iterator = iterator
        self.n = n
        self.cache = []

    def __iter__(self):
        return self

    def __next__(self):
        self.cache.append(next(self.iterator))
        if len(self.cache) < self.n:
            return self.__next__()
        if len(self.cache) > self.n:
            del self.cache[0]
        if len(self.cache) == 5:
            return self.cache

相关问题