Разделенный запятыми файл, который я хочу загрузить в словарь - PullRequest
2 голосов
/ 19 августа 2010

У меня есть файл, разделенный запятыми, строка выглядит следующим образом:

"ABC234234", 23

Я хочу загрузить это в словарь, ключом будет первая часть, т.е. "ABC234234 "

Я также должен удалить двойные кавычки.

Что это за способ питона?

Ответы [ 3 ]

6 голосов
/ 19 августа 2010

Я бы предложил (как всегда) открыть файл CSV с помощью оператора with (что гарантирует , это будет закрыто , когда вы закончите!) - кроме что ответ @ Карла, как правило, в порядке:

import csv

with open('yourfile.csv', 'rb') as f:
    thedict = dict(csv.reader(f))

и затем свободно используйте thedict, как вам требуется.

Обратите внимание, что значения (как и, разумеется, ключи) будут строки . Если вы знаете, что во втором столбце всегда есть целое число и хотите иметь значения int s, вы можете заменить присвоение на

    thedict = dict((k, int(v)) for k, v in csv.reader(f))

или, если вы предпочитаете избегать чрезмерной компактности / плотности в вашем коде, разбейте это последнее утверждение на, например:

    ks_vs = ((k, int(v)) for k, v in csv.reader(f))
    thedict = dict(ks_vs)

или разбейте его еще дальше, если хотите, конечно.

Это работает в Python 2.6 или выше. Если вы застряли с 2.5, чтобы он заработал, добавьте

from __future__ import with_statement

вверху модуля - остальная часть моего совета все еще применяется; -).

4 голосов
/ 19 августа 2010
import csv
d = dict(csv.reader(open("foo.txt", "rb")))
3 голосов
/ 19 августа 2010

Вы просили Pythonic . Если вы хотите следовать одному из правил в Дзэн Python («Ошибки никогда не должны проходить молча») и вы хотите проверить, что в ваших данных нет повторяющихся ключей, или выполнить другую проверку ошибок или очистку (примеры: ключ не пустая строка, вы хотите убрать начальные / конечные пробелы), вам нужно написать более подробный код.

#untested example
import csv
with open('the_file.csv', 'rb') as f:
    reader = csv.reader(f)
    the_dict = {}
    for rownum, row in enumerate(reader, start=1):
        if len(row) != 2:
            error('row length is not 2', rownum, row)
            continue
        k, v = [item.strip() for item in row]
        if not k:
            error('key is empty string', ...); continue
        if k in the_dict:
            error(...); continue
        the_dict[k] = v
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...