将 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
你可以使用字典理解,被认为更 pythonic 和 it 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
我有逗号分隔(,
)制表符分隔(\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
你可以使用字典理解,被认为更 pythonic 和 it 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