在python中读写csv-大-大

在python中读写csv-大-大,python,csv,rows,Python,Csv,Rows,我有一个12288+1列的csv,我想把它减少到4096+1列 在这个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 =

我有一个12288+1列的csv,我想把它减少到4096+1列

在这个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
导入csv
计数,num=0
a=''
将open('data.csv','rb')作为filecsv:
reader=csv.reader(filecsv)
对于读取器中的行:
当计数小于12290时:
a=a+str(第[:]行[计数])+','
计数=计数+3
num=num+1
打印数
打印
这只是为了有个想法


感谢您的帮助

如果您不介意使用图书馆,Pandas将能够很好地为您提供帮助

您可以使用pandas.read\u 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')

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

分成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]]
但是,如果
不是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

(未测试…

要删除连续的重复项,可以使用:

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

如果行的最末端可能存在相邻的重复项
0
1
,则仅删除
行[:-1]
(除最后一列外的所有列)中的重复项,并将最后一位
行[-1]
附加到结果中(如果要保留):

from itertools import islice

no_dups = map(itemgetter(0), groupby(islice(row, len(row)-1)))
no_dups.append(row[-1])
writer.writerow(no_dups)

这总是3人一组吗?是否有2个(或4个)的组需要保留多个相同的值?同一个值是否会出现多次,如果是,您会保留这两个值吗?我很难理解这个问题。您想从一行中获取前12990个值,删除重复项,然后将其减少到4097个值?对不起,我的解释很糟糕。基本上,我有我的原始csv,总是在一个序列3重复元素,但我只需要1。最后一个,或者位置12289是1或0,我也需要这个。这3个元素的序列是RGB颜色,我对灰色进行了转换,所以现在,这总是一样的,所以我想丢弃2,只捕获1。我有一个csv,其中300行(300张图片)用于12288(64x64像素)的RGB格式,所以现在,我想用4096+1(64x64像素的灰度)+1列我的位0或1如何维护这些列(0,3,6,9,12,15,…,12285,12288,12289)?我不明白…
只是错误
没有多大帮助。这是否是一个
ValueError
可能?如果是这样,请使用zip方法…哦,是的。最后一组不是3个元素,只是我唯一的列bite 0或1。@MarkAngel11:与答案相关:@dawg:我这样做了。现在只是个问题。在新csv中写入r ou g或b时,没有特征线('\n')。唯一行中的每个元素…@MarkAngel11:只需在适当的位置添加
\n
。可能在包含
r,g,b
的循环之后的
行的循环之后。听起来像是在用
r,g,b
在循环中添加
\n
,以便在每个元素之后添加它。。。
from itertools import islice

no_dups = map(itemgetter(0), groupby(islice(row, len(row)-1)))
no_dups.append(row[-1])
writer.writerow(no_dups)