У меня есть 2 файла CSV: «Данные» и «Отображение»:
- Файл 'Mapping' имеет 4 колонки:
Device_Name
,GDN
,Device_Type
, иDevice_OS
. Все четыре столбца заполнены. - Файл «Данные» содержит те же столбцы,
Device_Name
заполненный столбец, а остальные три столбца пустые. - Я хочу , чтобы мой код Python , чтобы открыть оба файла и для каждого
Device_Name
в файле данных, карта егоGDN
,Device_Type
иDevice_OS
значение из файла сопоставления.
Я знаю, как использовать dict, когда присутствуют только 2 столбца (необходимо сопоставить 1), но я не знаю, как этого добиться, когда нужно сопоставить 3 столбца.
Ниже приведен код, с помощью которого я попытался выполнить сопоставление Device_Type
:
x = dict([])
with open("Pricing Mapping_2013-04-22.csv", "rb") as in_file1:
file_map = csv.reader(in_file1, delimiter=',')
for row in file_map:
typemap = [row[0],row[2]]
x.append(typemap)
with open("Pricing_Updated_Cleaned.csv", "rb") as in_file2, open("Data Scraper_GDN.csv", "wb") as out_file:
writer = csv.writer(out_file, delimiter=',')
for row in csv.reader(in_file2, delimiter=','):
try:
row[27] = x[row[11]]
except KeyError:
row[27] = ""
writer.writerow(row)
Это возвращается Attribute Error
.
После некоторых исследований, я думаю, что мне нужно создать вложенный дикт, но я понятия не имею, как это сделать.
Device_Name
Столбец является ключом в обоих файлах, по этому ключу я хочу отобразить значения Device_OS, GDN & Device_Type из файла отображения в файл данных.row[27] = x[row[11]]["Device_OS"]
?Device_Name
индекс, а затем можете напрямую связатьjoin
два кадра данных с их индексомDevice_Name
.Ответы:
Вложенный dict - это словарь в словаре. Очень простая вещь
Вы также можете использовать пакет
defaultdict
изcollections
пакета для облегчения создания вложенных словарей.Вы можете заполнить это, как вы хотите.
Я бы порекомендовал в вашем коде что-то вроде следующего:
Согласно вашему комментарию :
Мое предложение было бы что - то вроде этого (без использования defaultdict):
Обратите внимание, что для разбора CSV-файлов существует модуль CSV .
источник
a.csv
b.csv
,a.csv
4 столбцаi j k l
,b.csv
также есть эти столбцы.i
является своего рода ключевыми столбцами для этих CSV-файлов.j k l
столбец пуст,a.csv
но заполненb.csv
. Я хочу отобразить значенияj k l
столбцов, используя 'i` в качестве ключевого столбца из файла b.csv в файл a.csv.ОБНОВЛЕНИЕ : для произвольной длины вложенного словаря, перейдите к этому ответу .
Используйте функцию defaultdict из коллекций.
Высокая производительность: «если ключ не в поле зрения» очень дорого, когда набор данных большой.
Низкие эксплуатационные расходы: сделать код более читабельным и легко расширяемым.
источник
from collections import defaultdict target_dict = defaultdict(dict) target_dict['1']['2']
дает мнеtarget_dict['1']['2'] KeyError: '2'
Для произвольных уровней вложенности:
источник
При использовании defaultdict и аналогичных вложенных модулей dict, таких как
nested_dict
, важно помнить , что поиск несуществующего ключа может непреднамеренно создать новую запись ключа в dict и вызвать большой хаос.Вот пример Python3 с
nested_dict
модулем:Выход:
источник