繁体   English   中英

将 csv 文件转换为字典后的空列表

[英]empty List after converting csv file to dictionary

我已将 csv 文件转换为字典列表。

csvfile = './xyz.csv'

jsonArray = []

with open(csvfile, encoding='utf_8_sig') as csvf:
   csvReader = csv.DictReader(csvf)

   for row in csvReader:
      jsonArray.append(row)

当我打印结果时,它看起来像这样(字典列表):

[
{
    'Meter-id': 'W000001',
    'January': '7.20',
    'February': '7.2010',
    'March': '7.34',
    'April': '7.4870',
},
{
    'Meter-id': 'W000002',
    'January': '301,069.00',
    'February': '318,592.000',
    'March': '331,158.00',
    'April': '345,322.000',
},
{
    'Meter-id': 'K000001',
    'January': '767,410.80',
    'February': '784,932.700',
    'March': '797,636.90',
    'April': '812,111.000',
},...
]

但是当我尝试使用数组对字典进行分组时,数组似乎是空的:

resp = defaultdict(list)

KEY_MAP = {
  'W': 'Warm',
  'K': "Cold"
  }

for key, group in itertools.groupby(jsonArray, key=lambda x: KEY_MAP.get(x["Meter-id"][0])):
for thing in group:
    resp[key].append(thing)

我在这里做错了什么?

先感谢您

一个

您的代码和示例对我来说效果很好(缩进除外)。 也许您可以尝试没有groupby的版本(特别是如果您的 json 数组未按组排序)

更新

如何修复IndexError: string index out of range

不要使用[0]而是使用像[:1]这样的切片来不引发异常并使用dict.getdefault参数返回默认组:

resp = defaultdict(list)
for x in jsonArray:
    group = KEY_MAP.get(x["Meter-id"][:1], 'Misc')
    resp[group].append(x)

在每种方法中,output 为:

defaultdict(list,
            {'Warm': [{'Meter-id': 'W000001',
               'January': '7.20',
               'February': '7.2010',
               'March': '7.34',
               'April': '7.4870'},
              {'Meter-id': 'W000002',
               'January': '301,069.00',
               'February': '318,592.000',
               'March': '331,158.00',
               'April': '345,322.000'}],
             'Cold': [{'Meter-id': 'K000001',
               'January': '767,410.80',
               'February': '784,932.700',
               'March': '797,636.90',
               'April': '812,111.000'}]})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM