将 2 列类似计数器的 csv 文件转换为 Python collections.Counter?

Convert 2-column counter-like csv file to Python collections.Counter?

我有逗号分隔(,)制表符分隔(\t),文件。

68,"phrase"\t
485,"another phrase"\t
43, "phrase 3"\t

有没有简单的方法把它扔进PythonCounter

这是我的最佳尝试。它有效但不是最快的。
在一个 400 万行的输入文件上 运行 大约需要 1.5 分钟。
根据 Daniel Mesejo 的建议,现在在一个 400 万行的输入文件上大约需要 40 秒。

注意:csv中的count值可以是科学计数法,需要转换。因此 int(float( 转换。

import csv
from collections import Counter

def convert_counter_like_csv_to_counter(file_to_convert):

    the_counter = Counter()
    with file_to_convert.open(encoding="utf-8") as f:
        csv_reader = csv.DictReader(f, delimiter="\t", fieldnames=["count", "title"])
        for row in csv_reader:
            the_counter[row["title"]] = int(float(row["count"]))

    return the_counter

你可以使用字典理解,被认为更 pythonicit can be marginally faster:

import csv
from collections import Counter


def convert_counter_like_csv_to_counter(file_to_convert):
    with file_to_convert.open(encoding="utf-8") as f:
        csv_reader = csv.DictReader(f, delimiter="\t", fieldnames=["count", "title"])
        the_counter = Counter({row["title"]: int(float(row["count"])) for row in csv_reader})
    return the_counter

我不能就此放弃,偶然发现了我认为是赢家的东西。

在测试中很明显循环遍历 csv.DictReader 的行是最慢的部分;大约需要 40 秒中的 30 秒。

我将其切换为简单 csv.reader 以查看我会得到什么。这导致列表行。我把它包裹在 dict 中,看看它是否直接转换。做到了!

然后我可以遍历本机字典而不是 csv.DictReader

结果...3 秒内完成 400 万行

def convert_counter_like_csv_to_counter(file_to_convert):
    with file_to_convert.open(encoding="utf-8") as f:
        csv_reader = csv.reader(f, delimiter="\t")
        d = dict(csv_reader)
        the_counter = Counter({phrase: int(float(count)) for count, phrase in d.items()})

    return the_counter