Конвертировать 2-колоночный встречно-подобный CSV-файл в коллекцию Python. - PullRequest
0 голосов
/ 06 декабря 2018

У меня разделенная запятыми (,) вкладка с разделителями (\t), файл.

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

Есть ли простой способ добавить его в Python Counter?

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Вы можете использовать словарное понимание, считается более Pythonic и это может быть незначительно быстрее :

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
0 голосов
/ 06 декабря 2018

Я не мог отпустить это и наткнулся на то, что я считаю победителем.

При тестировании было ясно, что цикл по строкам csv.DictReader был самой медленной частью;Примерно 30 из 40 секунд.

Я переключил его на простой csv.reader, чтобы посмотреть, что я получу.Это привело к строкам списков.Я обернул это в dict, чтобы увидеть, конвертировалось ли оно напрямую.Это было!

Тогда я мог бы перебирать собственный словарь вместо csv.DictReader.

Результат ... с 4 миллионами строк за 3 секунды !101

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
0 голосов
/ 06 декабря 2018

Вот моя лучшая попытка.Он работает, но не самый быстрый.
Требуется около 1,5 минут для запуска файла ввода с 4 миллионами строк.
Теперь требуется около 40 секунд для файла ввода с 4 миллионами строк после предложения.Даниэль Месехо.

Примечание : значение count в csv может быть в научной нотации и нуждается в преобразовании.Отсюда 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
...