[英]Read and write csv in python - big large
我有一个具有12288 + 1个colun的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
这只是出于一个想法。
谢谢你的帮助
如果您不介意使用图书馆,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')
如果它们总是三人一组,则丢掉2个。
分成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
(未测试...)
要删除连续的重复项,可以使用itertools.groupby
函数 :
#!/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文件。
如果有可能是相邻重复0
, 1
,在该行的最后再取出只在重复row[:-1]
所有,但最后一列),最后一位追加row[-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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.