在python中读写csv - big large

时间:2014-04-23 19:19:48

标签: python csv rows

我有一个带有12288 + 1 coluns的csv,并希望减少到4096 + 1 colums。

在这12288 + 1列中,它们在每三个上都是相同的值,最后一个值是一个位,0或1。

我需要保持最后一个值,并且对于重复的三个一组只需要1。

我的原始csv有300行或行,无论如何。我不知道如何捕捉其他行,而我的脚本只需要第一行/第一行。

来自原始csv 3,3,3,5,5,5,7,7,7,10,10,10 ... 20,20,20,50,50,50,1

想要最终的csv 3,5,7,10 ... 20,50,1

import csv

count, num = 0
a = ''
with open('data.csv','rb') as filecsv:
    reader = csv.reader(filecsv)
    for row in reader:
        while count < 12290:
            a = a + str(row[:][count])+','
            count = count + 3
            num = num + 1
print num
print a

这打印只是为了有个主意。

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

如果您不介意使用库,Pandas将能够很好地为您完成此操作。

您可以使用pandas.read_csv阅读csv。 use_cols参数指定要保留的列,因此您可以使用它来忽略这些重复的列。

columns = list(range(1,12288,3))
columns.append(12288)
data = pandas.read_csv('data.csv', usecols=columns)
data.to_csv('new_data.csv')

答案 1 :(得分:0)

如果他们总是三人一组,那就扔掉两个人。

分组成3组:

>>> row=range(9)
>>> [row[i:i+3] for i in range(0,len(row),3)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]

但是,如果row不是3的倍数,这将为您提供小于3的组:

>>> row=range(11)
>>> [row[i:i+3] for i in range(0,len(row),3)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]
                                    ^  ^   only two elements...

如果元素的数量可以是3的非倍数,请使用zip。它将丢弃不完整的r,g,b组:

>>> row=range(11)
>>> zip(*[iter(row)]*3)
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]

然后解压缩到r,g,b组件:

import csv

with open('data.csv','rb') as filecsv:
    reader = csv.reader(filecsv)
    for row in reader:
        for r, g, b in [row[i:i+3] for i in range(0,len(row),3)]:
            # use r or g or b, ignore the other two

如果您获得ValueError,则您拥有3组数据的非倍数(或者csv未正确解析数据)请按照说明使用zip

import csv

with open('data.csv','rb') as filecsv:
    reader = csv.reader(filecsv)
    for row in reader:
        for r, g, b in zip(*[iter(row)]*3):
            # use r or g or b, ignore the other two

(未经测试......)

答案 2 :(得分:0)

要删除连续重复项,可以使用itertools.groupby function

#!/usr/bin/env python
import csv
from itertools import groupby
from operator import itemgetter

with open('data.csv', 'rb') as file, open('output.csv', 'wb') as output_file:
    writer = csv.writer(output_file)
    for row in csv.reader(file):
        writer.writerow(map(itemgetter(0), groupby(row)))

它读取输入的csv文件并将其写入输出csv文件并删除连续的重复项。

如果在行的最后可能存在相邻的重复01,则仅在row[:-1](除了最后一列之外的所有列)中删除重复项,并追加最后一位{{如果要保留它,请输入结果:

row[-1]