我有一份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来关联数据。想知道是否有人有其他建议。
答案 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
这不是最快的方法,但如果没有我能够在你的数据集上测试它,我认为一个简单的解决方案是好的。