读取时csv中的组行

时间:2014-03-18 23:32:59

标签: python csv

我有一份csv格式的报告,其中包含一组分组数据。

也就是说,在某个时刻,我想一次处理来自2行的数据

0. headers,,,,
1. regular data,,,,
2. regular data,,,,
3. batched_data_a, 0,1,2,3
4. batched_data_a, 4,5,6,7
5. batched_data_b, 0,1,2,3
6. batched_data_b, 4,5,6,7
7. batched_data_c, 0,1,2,3
8. batched_data_c, 4,5,6,7

我想知道是否有人有策略。

现在,我能想到的只是使用for idx, row in enumerate( csvreader ):,并使用idx来关联数据。想知道是否有人有其他建议。

3 个答案:

答案 0 :(得分:1)

这对你有用吗?

#!/usr/bin/env python
import csv

cr = csv.reader(file("test.csv"))
while True:
    try:
        row1, row2 = cr.next(), cr.next()
        row = [row1[0]] + row1[1:] + row2[1:]
    except StopIteration:
        break
    print row

答案 1 :(得分:1)

我最终创建了一个自定义类来包装文件,并使用生成器(如建议的https://stackoverflow.com/users/1388392/m-wasowski)来处理每个部分。

我可能/应该使用https://stackoverflow.com/users/408426/rumple-stiltskin建议的行组合(这是一个好主意),但我已经写好了消费者。我在源代码中标记了答案,以便有时间重写!

class CustomFile(object):

    def __init__(self, csvdata):   
        self.csvdata = csvdata

    @property
    def header( self ):
        reader = csv.reader( self.csvdata[0:3] )
        for row in reader:
            yield row

    @property
    def body( self ):
        reader = csv.reader( self.csvdata[3:] )
        for l1 in reader :
            if not any(l1):
                raise StopIteration()
            l2 = reader.next()
            yield l1, l2



csvdata = open('data.csv', 'r').readlines()
csvdata = [i.strip() for i in csvdata ]

customFile = CustomFile( csvdata )
print [ i for i in customFile.header ]
print [ i for i in customFile.body ]

答案 2 :(得分:0)

假设真实数据中的第一列实际上是匹配的,例如如果'batched_data_a'跟在'batched_data_a'之后,那么它们会在一起,您可以将文件拆分为行列表,将行拆分为单词列表,然后使用索引进行迭代。

我的意思是

lines = file_name.splitlines()
split_lines = []
for lin in lines:
    split_lines.append(lin.split(","))

这将为您提供一个列表列表:每行现在是一个逗号分隔值列表,整个文件是一个行列表。然后,您可以通过检查相邻行是否匹配来迭代以获取所需的元组。

tuple_list = []
for i in range(0, len(split_lines) - 1):
    this_line = split_lines[i]
    next_line = split_lines[i+1]
    if this_line[0] == next_line[0]:
        k = 1
        while k < 5:
            a = this_line[k]
            b = next_line[k]
            tuple_list.append((this_line[0], a, b))
            k += 1

这不是最快的方法,但如果没有我能够在你的数据集上测试它,我认为一个简单的解决方案是好的。