Большой вложенный словарь данных, работающий только с «последним ключом» - PullRequest
0 голосов
/ 24 января 2020

[РЕДАКТИРОВАТЬ] - Проблема не с самим словарем. Неизмененные копии исходного файла 'census2010.py' не отображают проблему.

Я пытаюсь закодировать данные Excel во вложенный словарь для дальнейшего анализа.

Я ожидаю, что смогу зачитать любой ключ из словаря. Например, я ожидаю, что сработает следующее:

>>> census2010.allData['AK']['Anchorage']
{'pop': 291826, 'tracts': 55}

Что я получу:

census2010.allData['AK']['Anchorage']
Traceback (most recent call last):
  File "<input>", line 1, in <module>
KeyError: 'AK'

Единственный ключ, который работает:

census2010.allData['WY']['Weston']
{'pop': 3894, 'tracts': 1}

I создал файл Census2010.py с данными из папки censuspopdata.xlsx (процесс, описанный в главе 12 «Автоматизация скучного материала»).

При непосредственном просмотре Census2010.py отображаются все вложенные ключи, но при импорте 'census2010.py' и опросе словаря отображается только "окончательный" ключ.

Вот скрипт для генерации census2010.py: (и он работает без ошибок)

import openpyxl, pprint, os
print('Opening workbook...')
os.getcwd()
p = os.getcwd()
os.chdir(p + '\\automatestuffdirectorytest\\')
wb = openpyxl.load_workbook('censuspopdata.xlsx')
sheet = wb['Population by Census Tract']
countyData = {}
print('Reading rows...')
for row in range(2, sheet.max_row + 1):
    # Each row in the spreadsheet has data for one census tract.
    state = sheet['B' + str(row)].value
    county = sheet['C' + str(row)].value
    pop = sheet['D' + str(row)].value
    # Make sure the key for this state exists.
    countyData.setdefault(state, {})
    # Make sure the key for this county in this state exists.
    countyData[state].setdefault(county, {'tracts': 0, 'pop': 0})
    # Each row represents one census tract, so increment by one.
    countyData[state][county]['tracts'] += 1
    # Increase the county pop by the pop in this census tract.
    countyData[state][county]['pop'] += int(pop)
print('Writing results...')
resultFile = open('census2010.py', 'w')
resultFile.write('allData = ' + pprint.pformat(countyData))
resultFile.close()
print('Done.')

и вот несколько фрагментов полученного словаря (3143 строки)

allData = {'AK': {'Aleutians East': {'pop': 3141, 'tracts': 1},
        'Aleutians West': {'pop': 5561, 'tracts': 2},
        'Anchorage': {'pop': 291826, 'tracts': 55}, # ...

- snip -

        'Yukon-Koyukuk': {'pop': 5588, 'tracts': 4}}, # ...

- snip -

 'WY': {'Albany': {'pop': 36299, 'tracts': 10}, # ...

--snip -

        'Weston': {'pop': 7208, 'tracts': 2}}}

Но единственный ключ, который можно найти, - это [WY] [Weston]

for i in allData.items():
...    print(i)
...    
('WY', {'Weston': {'pop': 3894, 'tracts': 1}})

, вызывающий ключи работает только с ['WY'] ['Weston']

census2010.allData['WY']['Weston']
{'pop': 3894, 'tracts': 1}
...