Python CSV解析字典和查找元素的索引

时间:2018-07-12 21:26:07

标签: python csv dictionary

我有一个要在我的Python程序中使用的CSV字典dictionary.txt。我已经使用标准库csv打开文档。这些是用户输入以选择难度的难度级别。如果用户选择“ EASY”,则我希望能够忽略标题,并能够获得“ EASY”标题下的元素数量,直到下一个难度之前。标头前面的数字是难度。我在这些标题之间有标题和数据,类似于:

1, ##### EASY #####
key1, value1
key2, value2
2, ##### MEDIUM #####
key3, value3
key4, value4
3, ##### HARD #####
key5, value5
key6, value6

我想为每个部分返回字典类型的有用元素的字典类型(只是键n,值n),还有一个“ ALL”选项。我当前的代码看起来像这样,但是我不知道从这里做什么:

with open("PLUG_dict.txt", "r") as db:
    mydict = dict(csv.reader(db))
for key in mydict.keys():
    if len(key) == 1:
        sections.append(mydict[key])

我如何:

  • 找到指定难度(起点和终点)的线的索引?
  • 找到困难之间的元素数量?
  • 处理最后一个困难“ HARD”,这样将其运行到字典末尾不会成为错误吗?
  • 如果我想包括一个分类“ ALL”,该分类仅返回字典中所有有用的元素,该怎么做?

3 个答案:

答案 0 :(得分:0)

在代码中,将文件内容转换为字典时,由于dict是无序的,因此您将失去顺序:

>>> dict(csv.reader(db))
{
  '1': ' ##### EASY #####',
  '3': ' ##### HARD #####',
  '2': ' ##### MEDIUM #####',
  'key3': ' value3',
  'key2': ' value2',
  'key1': ' value1',
  'key6': ' value6',
  'key5': ' value5',
  'key4': ' value4'
}

例如,您可以迭代csv.reader(f)返回的内容以完全映射文件中的内容:

mydict = {}

with open("PLUG_dict.txt", "r") as db:
    for key, val in csv.reader(db):
        if len(key) == 1:
           # Difficulty line
           dif = key
           # Construct the entry for this difficulty, and save its name
           mydict[dif] = { 'name' : val }
        else:
           # key, val line
           # Simply add it in the dict of the current difficulty
           mydict[dif][key] = val

如果文件的第一行不是“难度行” ,则此方法将无效。 这将构造以下mydict

{
  '1': {
    'name': ' ##### EASY #####',
    'key1': ' value1',
    'key2': ' value2'
  },
  '3': {
    'name': ' ##### HARD #####',
    'key5': ' value5',
    'key6': ' value6'
  },
  '2': {
    'key3': ' value3',
    'name': ' ##### MEDIUM #####',
    'key4': ' value4'
  }
}

您确实可以更改处理'name'的方式。

然后,使用dif = '1',您可以:

  • 查找指定难度的值:

    mydict[dif]
    

    将返回

    {
      'name': ' ##### EASY #####',
      'key1': ' value1',
      'key2': ' value2'
    }
    
  • 查找困难下的元素数量:

    len(mydict[dif]) - 1
    

    将返回

    2
    

    在这里,- 1对于从计数中删除'name'是必要的。根据您处理'name'的方式,可以将其丢弃。

  • 返回字典中所有难度下的所有元素:

    {
      key: val
      for elements in mydict.values()
      for key, val in elements.items()
      if key != 'name'
    }
    

    将返回

    {
      'key3': ' value3',
      'key2': ' value2',
      'key1': ' value1',
      'key6': ' value6',
      'key5': ' value5',
      'key4': ' value4'
    }
    

    此外,根据您处理'name'的方式,条件if key != 'name'可以省略。

  • 我不确定是否了解有关HARD错误的问题吗?

希望对您有帮助!

答案 1 :(得分:0)

您可以按照以下方式进行操作:

import csv

with open('dictionary.txt', 'r') as f:
    data={}
    k=None 
    for row in csv.reader(f):
        print row
        if row[1] in ' ##### EASY ##### ##### MEDIUM ##### ##### HARD #####':
            k=row[1].strip()
            data[k]={}
        elif k:
            data[k][row[0]]=row[1]

产生:

>>> data
{'##### HARD #####': {'key6': ' value6', 'key5': ' value5'}, '##### EASY #####': {'key2': ' value2', 'key1': ' value1'}, '##### MEDIUM #####': {'key3': ' value3', 'key4': ' value4'}}

然后通过data[category][key_you_want_in_category]

进行访问

答案 2 :(得分:0)

请使用Python的数据类型比csv更合适

改为使用plugin_dict.py并将其放入

levels = {'EASY': ["value 1", "value 2"],
      'MEDIUM': ["value 3", "value 4"],
      'HARD': ["value 5", "value 5"]
}

然后做:

from plug_dict.py import levels

SECTIONS = []


#index of a particular line
Unnecessary, get the values instead
values_of_sect = levels['HARD']

# THE DIFFICULTIES
for key in levels:
    SECTIONS.append(key)


# no of elements in between difficulties
# do
elements = len(levels['HARD'])

# Handle the 'HARD' difficulty
unnecessary, python types handles it beautifully, you will get no errors