0

给定一个制表符分隔的文件,如何计算每列中的元素总数?我的文件大小约为 6GB。

column  count   min max sum mean
80  29573061    2   40  855179253   28.92
81  28861459    2   40  802912711   27.82
82                  40  778234605   27.63
83  27479902    2   40              27.44
84  26800815        40  729443846   27.22
85  26127825    2       701704155   26.86

输出:

`column` has  6 items in it
`count` has 5 items in it
 and so on
4

4 回答 4

2

怎么样:

import csv
from collections import Counter

counts = Counter()
with open("count.tsv", "rb") as fp:
    reader = csv.DictReader(fp, delimiter="\t")
    for row in reader:
        counts += Counter(k for k,v in row.items() if v.strip())

这使

>>> counts
Counter({'column': 6, 'mean': 6, 'count': 5, 'max': 5, 'sum': 5, 'min': 4})

虽然,正如@Cartroo 所指出的,您可能必须根据您想要考虑为空的值来更改空值标准。

于 2013-04-10T19:21:02.573 回答
0

假设您的意思是计算非空白文本的出现次数,如下所示:

import collections

titles = None
counts = collections.defaultdict(int)
with open("file.txt") as fd:
    for line in fd:
        items = line.split("\t")
        if titles is None:
            if items:
                titles = [i.strip() for i in items]
            continue
        for i in xrange(min(len(titles), len(items))):
            if items[i].strip():
                counts[titles[i]] += 1

for column, count in counts.iteritems():
    print "Column %s has %d items" % (column, count)

请注意,此代码依赖于没有比标题行更多元素的行,尽管它确实处理较短的行。我确信使用列表推导等有更简洁的方法,但我认为更详细的风格可能会更清晰。

如果您的意思是对值本身或类似值求和,则需要对items列表做一些更聪明的事情。仅作为示例,要查找“计数”列的总和:

total_count = 0
with open("file.txt") as fd:
    for line in fd
        items = line.split("\t")
        try:
            total_count += int(items[1])
        except ValueError:
            pass

我不太确定您要做什么,但希望这些示例能让您了解如何以简单的方式进行此类处理。

于 2013-04-10T19:09:57.680 回答
0

Map reduce 库就是为这样的大数据处理而制作的。这是使用它的好主意。 https://developers.google.com/appengine/docs/python/dataprocessing/overview#Downloading_the_Mapreduce_Library

于 2013-04-10T19:52:55.960 回答
0

我会做这样的事情:

  1. 逐行读取文件
  2. 用制表符分隔每一行 ('\t')
    • 对于每个拆分,遍历列表的每个元素
      • 检查空字符串值
        • 如果有一个空字符串,不要做任何事情
        • 如果没有空字符串,则增加该列的计数

对于列数,您可以只使用另一个列表。例如,counts 是我们的列表,counts[0] 将是“column”列的元素数,counts[1] 将是“count”列的元素数,等等。

于 2013-04-10T19:15:45.593 回答