[英]Python CSV Parsing Dictionary and Finding Elements' Indices
我有一個要在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])
我如何:
在代碼中,將文件內容轉換為字典時,由於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
如果文件的第一行不是“ Difficulty line”,這將不起作用。 這將構建以下的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
錯誤的問題嗎?
希望對您有所幫助!
您可以按照以下方式進行操作:
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]
請Python的數據類型比csv更適合此
改用plug_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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.