Итеративная обработка csv по 3 строки за раз в Python - PullRequest
0 голосов
/ 07 августа 2020

У меня есть файл csv, например:

A, B, C, D
2,3,4,5
4,3,5,2
5,8,3,9
7,4,2,6
8,6,3,7

Я хочу получить значения B из 3 строк за раз (для значений первой итерации будет 3,3,8) и сохранить в некоторой переменной (value1=3,value2=3,value3=8) и передать ее функции. Как только эти значения будут обработаны. Я хочу получить значения из следующих 3 строк (value1=3,value2=8,value3=4) и т. Д.

Файл csv большой. Я разработчик JAVA, по возможности предложите максимально простой код.

Ответы [ 4 ]

2 голосов
/ 07 августа 2020

Простым решением будет следующее:

import pandas as pd
data = pd.read_csv("path.csv")

for i in range(len(data)-2):
    value1 = data.loc[i,"B"]
    value2 = data.loc[i+1,"B"]
    value3 = data.loc[i+2,"B"]
    function(value1, value2, value3)
1 голос
/ 07 августа 2020

Это возможное решение (я использовал функцию, предложенную в этом ответе):

import csv
import itertools

# Function to iterate the csv file by chunks (of any size)
def grouper(n, iterable):
    it = iter(iterable)
    while True:
       chunk = tuple(itertools.islice(it, n))
       if not chunk:
           return
       yield chunk

# Open the csv file
with open('myfile.csv') as f:
    csvreader = csv.reader(f)
    # Read the headers: ['A', 'B', 'C', 'D']
    headers = next(csvreader, None)
    # Read the rest of the file by chunks of 3 rows
    for chunk in grouper(3, csvreader):
        # do something with your chunk of rows
        print(chunk)

Результат печати:

(['2', '3', '4', '5'], ['4', '3', '5', '2'], ['5', '8', '3', '9'])
(['7', '4', '2', '6'], ['8', '6', '3', '7'])
0 голосов
/ 07 августа 2020

Вы можете использовать pandas для чтения вашего CSV с аргументом chunksize, как описано здесь ( Как я могу частично прочитать огромный CSV-файл? )

import pandas as pd

#Function that you want to apply to you arguments
def fn(A, B, C, D):
    print(sum(A), sum(B), sum(C), sum(D))

#Iterate through the chunks
for chunk in pd.read_csv('test.csv', chunksize=3):
    #Convert dataframe to dict
    chunk_dict = chunk.to_dict(orient = 'list')
    #Pass arguments to your functions
    fn(**chunk_dict)
0 голосов
/ 07 августа 2020

Вы можете использовать csv модуль

import csv
with open('data.txt') as fp:
    reader = csv.reader(fp)
    next(reader) #skips the header
    res = [int(row[1]) for row in reader]
    groups = (res[idx: idx + 3] for idx in range(0, len(res) - 2))
for a, b, c in groups:
    print(a, b, c)

Вывод:

3 3 8
3 8 4
8 4 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...