繁体   English   中英

在python中读取和写入csv-大大

[英]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文件。

如果有可能是相邻重复01 ,在该行的最后再取出只在重复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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM