Я пытаюсь создать словарь из файла CSV. Первый столбец файла csv содержит уникальные ключи, а второй столбец содержит значения. Каждая строка файла CSV представляет собой уникальный ключ, пару значений в словаре. Я пытался использовать csv.DictReader
и csv.DictWriter
классы, но я мог понять только как создать новый словарь для каждой строки. Я хочу один словарь. Вот код, который я пытаюсь использовать:
import csv
with open('coors.csv', mode='r') as infile:
reader = csv.reader(infile)
with open('coors_new.csv', mode='w') as outfile:
writer = csv.writer(outfile)
for rows in reader:
k = rows[0]
v = rows[1]
mydict = {k:v for k, v in rows}
print(mydict)
Когда я запускаю приведенный выше код, я получаю ValueError: too many values to unpack (expected 2)
. Как мне создать один словарь из файла CSV? Спасибо.
python
csv
dictionary
list-comprehension
drbunsen
источник
источник
Ответы:
Я считаю, что синтаксис, который вы искали, выглядит следующим образом:
В качестве альтернативы для python <= 2.7.1 вы хотите:
источник
Откройте файл, вызвав open, а затем
csv.DictReader
.Вы можете выполнять итерацию по строкам объекта для чтения диктофонов в csv-файле, выполняя итерации по input_file.
ИЛИ Для доступа только к первой строке
ОБНОВЛЕНИЕ В версиях Python 3+ этот код немного изменится:
источник
next(dictobj)
вместоdictobj.next()
версий Python 3+.источник
for row in reader: k, v = row
если вы можете просто написатьfor k, v in reader
. И если вы ожидаете, что этот читатель является итеративным, производящим двухэлементные элементы, то вы можете просто передать его непосредственно в dict для преобразования.d = dict(reader)
намного короче и значительно быстрее на огромных наборах данных.for row in reader
парадигме легче работать , то это может (после долгосрочного развития) быть более практичным. Я согласен с вами на короткий срок, но остерегайтесь преждевременной оптимизации.Это не элегантно, а однолинейное решение с использованием панд.
Если вы хотите указать dtype для вашего индекса (он не может быть указан в read_csv, если вы используете аргумент index_col из-за ошибки ):
источник
Вы должны просто преобразовать csv.reader в dict:
источник
ValueError: dictionary update sequence element #2 has length 3; 2 is required
.filter
вызовmap(operator.itemgetter(slice(2)), ...)
, поэтому он будет тянуть только первые два iterms, что делает его:dict(map(operator.itemgetter(slice(2)), filter(None, csv.reader(f))))
. Если это Python 2, обязательно сделайтеfrom future_builtins import map, filter
так, чтобы онdict
считывал генератор напрямую, вместо того, чтобыlist
сначала создавать несколько ненужных временных s).Вы также можете использовать NumPy для этого.
источник
Я бы предложил добавить
if rows
в случае, если в конце файла есть пустая строкаисточник
Однострочное решение
источник
Если вы согласны с использованием numpy пакета, вы можете сделать что-то вроде следующего:
источник
Для простых файлов CSV, таких как следующие
Вы можете преобразовать его в словарь Python, используя только встроенные модули
Это должно привести к следующему словарю
Примечание. Словари Python имеют уникальные ключи, поэтому, если ваш CSV-файл содержит дубликаты,
ids
вы должны добавить каждую строку в список.источник
set_default
: csv_dict.set_default (ключ, []). append ({ключ: значение для ключа, значение в zip (заголовок, значения)})).append
команде был очень полезен. В итоге я использовал тот же синтаксис вrow.update
итерации и добавлении кDictReader
объекту, который был сделан из файла CSV.Вы можете использовать это, это довольно круто:
источник
Было опубликовано много решений, и я хотел бы внести свой вклад в мое, которое работает для другого числа столбцов в файле CSV. Он создает словарь с одним ключом на столбец, а значением для каждого ключа является список с элементами в этом столбце.
источник
например, с пандами это намного проще. при условии, что у вас есть следующие данные в виде CSV, и давайте назовем их
test.txt
/test.csv
(вы знаете, CSV - это своего рода текстовый файл)теперь с помощью панд
для каждого ряда это будет
и это все.
источник
Попробуйте использовать
defaultdict
иDictReader
.Возвращает:
источник