[РЕДАКТИРОВАТЬ] - Проблема не с самим словарем. Неизмененные копии исходного файла '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}