@zhangyu756897669
2017-09-25T15:52:27.000000Z
字数 4633
阅读 1008
python官方文档
,这里是从电子表格文件中读取单元格所涉及的所有功能,方法和数据类型的缩写:
假设你有一份来自2010年美国人口普查数据的电子数据表,而且,您将无数次浏览数千行,以统计每个县的总人口和人口普查数量。 (人口普查区只是为普查目的而定义的地理区域。)每排代表一个人口普查区。我们将命名电子表格文件censuspopdata.xlsx,您可以从http://nostarch.com/automatestuff/下载。
图一
即使Excel可以计算多个所选单元格的总和,您仍然必须为每个3000多个县选择单元格。即使手动计算一个县的人口只需几秒钟,整个电子表格需要数小时的时间。
在这个项目中,您将编写一个脚本,可以从普查电子表格文件中读取,并在几秒钟内计算每个县的统计信息。
这是你的程序所做的:
这意味着您的代码将需要执行以下操作:
在censuspopdata.xlsx电子表格中只有一张表,名为“人口普查条例”,每行都保存一个人口普查区的数据。列是道号(A),国家缩写(B),县名(C)和道的人口(D)。
打开一个新的文件编辑器窗口并输入以下代码。将文件另存为readCensusExcel.py。
import openpyxl, pprint #❶
print('Opening workbook...')
wb = openpyxl.load_workbook('censuspopdata.xlsx')#❷
#❸
sheet = wb.get_sheet_by_name('Population by Census Tract')
countyData = {}
print('Reading rows...')
for row in range(2, sheet.max_row + 1): #❹
#电子表格中的每一行都有一个人口普查区的数据。
state = sheet['B' + str(row)].value
county = sheet['C' + str(row)].value
pop = sheet['D' + str(row)].value
此代码导入openpyxl模块以及用于打印最终县级数据的打印模块❶。然后它打开censuspopdata.xlsx文件❷,获取具有人口普查数据❸的表格,并开始迭代其行❹。
请注意,您还创建了一个名为countyData的变量,它将包含您为每个县计算的人口和数量。在您可以存储任何内容之前,您应该确定如何在其中构建数据。
存储在countyData中的数据结构将是一个以状态缩写为键的字典。每个州的缩写将映射到另一个字典,其字符串是该州的县名字符串。每个县名将依次映射到一个字典,只有两个键,“tracts”和“pop”。这些钥匙映射到县的人口普查数量和人口。例如,字典看起来与此类似:
{'AK': {'Aleutians East': {'pop': 3141, 'tracts': 1},
'Aleutians West': {'pop': 5561, 'tracts': 2},
'Anchorage': {'pop': 291826, 'tracts': 55},
'Bethel': {'pop': 17013, 'tracts': 3},
'Bristol Bay': {'pop': 997, 'tracts': 1},
--snip--
如果以前的字典存储在countyData中,以下表达式将如下所示:
countyData['AK']['Anchorage']['pop']
291826
countyData['AK']['Anchorage']['tracts']
55
通常,countyData字典的关键词看起来像是这样:
countyData[state abbrev][county]['tracts']
countyData[state abbrev][county]['pop']
现在你知道countyData的结构如何,你可以编写将填写县数据的代码。将以下代码添加到程序底部:
import openpyxl, pprint #❶
print('Opening workbook...')
wb = openpyxl.load_workbook('censuspopdata.xlsx')#❷
#❸
sheet = wb.get_sheet_by_name('Population by Census Tract')
countyData = {}
print('Reading rows...')
for row in range(2, sheet.max_row + 1): #❹
#电子表格中的每一行都有一个人口普查区的数据。
state = sheet['B' + str(row)].value
county = sheet['C' + str(row)].value
pop = sheet['D' + str(row)].value
#确保此状态的键存在。
countyData.setdefault(state, {}) #❶
#确保在这个州的这个县的关键存在。
countyData[state].setdefault(county, {'tracts': 0, 'pop': 0}) #❷
# 每行代表一个人口普查区,并依次增加一个。
countyData[state][county]['tracts'] += 1 #❸
#在这个人口普查的流行音乐中增加县流行音乐。
countyData[state][county]['pop'] += int(pop) #❹
Opening workbook...
Reading rows...
最后两行代码执行实际计算工作,增加❸的值❸,并增加for循环每次迭代时当前县的pop the值。
其他代码在那里,因为您不能将县字典添加为州缩写键的值,直到key本身存在于countyData中。 (也就是说,如果“AK”键不存在,那么countyData ['AK'] ['Anchorage'] ['tracts'] = 1将导致错误。)为了确保数据中存在状态缩写键结构中,如果状态❶不存在,则需要调用setdefault()方法来设置值。
正如countyData字典需要一个字典作为每个州缩写键的值,每个这些字典都需要自己的字典作为每个县密钥的❷。并且这些字典中的每一个依次将需要以整数值0开始的键“行”和“弹出”(如果您失去了字典结构的跟踪,请回到本节开头的示例字典。)
由于setdefault()将不会执行任何操作,如果密钥已经存在,您可以在for循环的每次迭代中调用它,而不会有问题。
在for循环完成后,countyData字典将包含所有由县和州键入的人口和道路信息。此时,您可以编写更多的代码,将其写入文本文件或其他Excel电子表格。现在,我们只需要使用pprint.pformat()函数将countyData字典值作为一个大字符串写入名为census2010.py的文件。将以下代码添加到程序的底部(确保保持不变,使其保持在for循环之外):
import openpyxl, pprint #❶
print('Opening workbook...')
wb = openpyxl.load_workbook('censuspopdata.xlsx')#❷
#❸
sheet = wb.get_sheet_by_name('Population by Census Tract')
countyData = {}
print('Reading rows...')
for row in range(2, sheet.max_row + 1): #❹
#电子表格中的每一行都有一个人口普查区的数据。
state = sheet['B' + str(row)].value
county = sheet['C' + str(row)].value
pop = sheet['D' + str(row)].value
#确保此状态的键存在。
countyData.setdefault(state, {}) #❶
#确保在这个州的这个县的关键存在。
countyData[state].setdefault(county, {'tracts': 0, 'pop': 0}) #❷
# 每行代表一个人口普查区,并依次增加一个。
countyData[state][county]['tracts'] += 1 #❸
#在这个人口普查的流行音乐中增加县流行音乐。
countyData[state][county]['pop'] += int(pop) #❹
#打开一个新的文本文件并写入其中的countyData的内容。
print('Writing results...')
resultFile = open('census2010.py', 'w')
resultFile.write('allData = ' + pprint.pformat(countyData))
resultFile.close()
print('Done.')
Opening workbook...
Reading rows...
Writing results...
Done.
pprint.pformat()函数生成一个字符串,它本身被格式化为有效的Python代码。通过将其输出到名为census2010.py的文本文件,您已经从您的Python程序生成了一个Python程序!这可能看起来很复杂,但优点是您现在可以像任何其他Python模块一样导入census2010.py。将当前工作目录更改为文件夹,然后将其导入:
import os
os.chdir('C:\\Python34')
import census2010
census2010.allData['AK']['Anchorage']
{'pop': 291826, 'tracts': 55}
anchoragePop = census2010.allData['AK']['Anchorage']['pop']
print('The 2010 population of Anchorage was ' + str(anchoragePop))
The 2010 population of Anchorage was 291826
许多企业和办公室使用Excel来存储各种类型的数据,并且电子表格变得庞大而且不方便,这并不罕见。解析Excel电子表格的任何程序都具有相似的结构:它加载电子表格文件,预处理一些变量或数据结构,然后循环遍历电子表格中的每一行。这样一个程序可以做到以下几点:
* 比较电子表格中多行的数据。
* 打开多个Excel文件并比较电子表格之间的数据。
* 检查电子表格在任何单元格中是否有空白行或无效数据,并提醒用户是否存在。
* 从电子表格读取数据,并将其用作Python程序的输入。