[关闭]
@zhangyu756897669 2017-09-25T15:52:27.000000Z 字数 4633 阅读 1008

用python打开excel 文件

python官方文档


工作簿,表格,单元格

,这里是从电子表格文件中读取单元格所涉及的所有功能,方法和数据类型的缩写:

项目:从电子表格中读取数据

假设你有一份来自2010年美国人口普查数据的电子数据表,而且,您将无数次浏览数千行,以统计每个县的总人口和人口普查数量。 (人口普查区只是为普查目的而定义的地理区域。)每排代表一个人口普查区。我们将命名电子表格文件censuspopdata.xlsx,您可以从http://nostarch.com/automatestuff/下载。

图一

即使Excel可以计算多个所选单元格的总和,您仍然必须为每个3000多个县选择单元格。即使手动计算一个县的人口只需几秒钟,整个电子表格需要数小时的时间。

在这个项目中,您将编写一个脚本,可以从普查电子表格文件中读取,并在几秒钟内计算每个县的统计信息。
这是你的程序所做的:

这意味着您的代码将需要执行以下操作:

步骤1:阅读电子表格数据

在censuspopdata.xlsx电子表格中只有一张表,名为“人口普查条例”,每行都保存一个人口普查区的数据。列是道号(A),国家缩写(B),县名(C)和道的人口(D)。

打开一个新的文件编辑器窗口并输入以下代码。将文件另存为readCensusExcel.py。

  1. import openpyxl, pprint #❶
  2. print('Opening workbook...')
  3. wb = openpyxl.load_workbook('censuspopdata.xlsx')#❷
  4. #❸
  5. sheet = wb.get_sheet_by_name('Population by Census Tract')
  6. countyData = {}
  7. print('Reading rows...')
  8. for row in range(2, sheet.max_row + 1): #❹
  9. #电子表格中的每一行都有一个人口普查区的数据。
  10. state = sheet['B' + str(row)].value
  11. county = sheet['C' + str(row)].value
  12. pop = sheet['D' + str(row)].value

此代码导入openpyxl模块以及用于打印最终县级数据的打印模块❶。然后它打开censuspopdata.xlsx文件❷,获取具有人口普查数据❸的表格,并开始迭代其行❹。

请注意,您还创建了一个名为countyData的变量,它将包含您为每个县计算的人口和数量。在您可以存储任何内容之前,您应该确定如何在其中构建数据。

步骤2:填充数据结构

存储在countyData中的数据结构将是一个以状态缩写为键的字典。每个州的缩写将映射到另一个字典,其字符串是该州的县名字符串。每个县名将依次映射到一个字典,只有两个键,“tracts”和“pop”。这些钥匙映射到县的人口普查数量和人口。例如,字典看起来与此类似:

  1. {'AK': {'Aleutians East': {'pop': 3141, 'tracts': 1},
  2. 'Aleutians West': {'pop': 5561, 'tracts': 2},
  3. 'Anchorage': {'pop': 291826, 'tracts': 55},
  4. 'Bethel': {'pop': 17013, 'tracts': 3},
  5. 'Bristol Bay': {'pop': 997, 'tracts': 1},
  6. --snip--

如果以前的字典存储在countyData中,以下表达式将如下所示:

  1. countyData['AK']['Anchorage']['pop']

291826

  1. countyData['AK']['Anchorage']['tracts']

55

通常,countyData字典的关键词看起来像是这样:

  1. countyData[state abbrev][county]['tracts']
  2. countyData[state abbrev][county]['pop']

现在你知道countyData的结构如何,你可以编写将填写县数据的代码。将以下代码添加到程序底部:

  1. import openpyxl, pprint #❶
  2. print('Opening workbook...')
  3. wb = openpyxl.load_workbook('censuspopdata.xlsx')#❷
  4. #❸
  5. sheet = wb.get_sheet_by_name('Population by Census Tract')
  6. countyData = {}
  7. print('Reading rows...')
  8. for row in range(2, sheet.max_row + 1): #❹
  9. #电子表格中的每一行都有一个人口普查区的数据。
  10. state = sheet['B' + str(row)].value
  11. county = sheet['C' + str(row)].value
  12. pop = sheet['D' + str(row)].value
  13. #确保此状态的键存在。
  14. countyData.setdefault(state, {}) #❶
  15. #确保在这个州的这个县的关键存在。
  16. countyData[state].setdefault(county, {'tracts': 0, 'pop': 0}) #❷
  17. # 每行代表一个人口普查区,并依次增加一个。
  18. countyData[state][county]['tracts'] += 1 #❸
  19. #在这个人口普查的流行音乐中增加县流行音乐。
  20. 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循环的每次迭代中调用它,而不会有问题。

步骤3:将结果写入文件

在for循环完成后,countyData字典将包含所有由县和州键入的人口和道路信息。此时,您可以编写更多的代码,将其写入文本文件或其他Excel电子表格。现在,我们只需要使用pprint.pformat()函数将countyData字典值作为一个大字符串写入名为census2010.py的文件。将以下代码添加到程序的底部(确保保持不变,使其保持在for循环之外):

  1. import openpyxl, pprint #❶
  2. print('Opening workbook...')
  3. wb = openpyxl.load_workbook('censuspopdata.xlsx')#❷
  4. #❸
  5. sheet = wb.get_sheet_by_name('Population by Census Tract')
  6. countyData = {}
  7. print('Reading rows...')
  8. for row in range(2, sheet.max_row + 1): #❹
  9. #电子表格中的每一行都有一个人口普查区的数据。
  10. state = sheet['B' + str(row)].value
  11. county = sheet['C' + str(row)].value
  12. pop = sheet['D' + str(row)].value
  13. #确保此状态的键存在。
  14. countyData.setdefault(state, {}) #❶
  15. #确保在这个州的这个县的关键存在。
  16. countyData[state].setdefault(county, {'tracts': 0, 'pop': 0}) #❷
  17. # 每行代表一个人口普查区,并依次增加一个。
  18. countyData[state][county]['tracts'] += 1 #❸
  19. #在这个人口普查的流行音乐中增加县流行音乐。
  20. countyData[state][county]['pop'] += int(pop) #❹
  21. #打开一个新的文本文件并写入其中的countyData的内容。
  22. print('Writing results...')
  23. resultFile = open('census2010.py', 'w')
  24. resultFile.write('allData = ' + pprint.pformat(countyData))
  25. resultFile.close()
  26. print('Done.')

Opening workbook...
Reading rows...
Writing results...
Done.

pprint.pformat()函数生成一个字符串,它本身被格式化为有效的Python代码。通过将其输出到名为census2010.py的文本文件,您已经从您的Python程序生成了一个Python程序!这可能看起来很复杂,但优点是您现在可以像任何其他Python模块一样导入census2010.py。将当前工作目录更改为文件夹,然后将其导入:

  1. import os
  2. os.chdir('C:\\Python34')
  3. import census2010
  4. census2010.allData['AK']['Anchorage']

{'pop': 291826, 'tracts': 55}

  1. anchoragePop = census2010.allData['AK']['Anchorage']['pop']
  2. print('The 2010 population of Anchorage was ' + str(anchoragePop))

The 2010 population of Anchorage was 291826

类似程序的想法

许多企业和办公室使用Excel来存储各种类型的数据,并且电子表格变得庞大而且不方便,这并不罕见。解析Excel电子表格的任何程序都具有相似的结构:它加载电子表格文件,预处理一些变量或数据结构,然后循环遍历电子表格中的每一行。这样一个程序可以做到以下几点:
* 比较电子表格中多行的数据。
* 打开多个Excel文件并比较电子表格之间的数据。
* 检查电子表格在任何单元格中是否有空白行或无效数据,并提醒用户是否存在。
* 从电子表格读取数据,并将其用作Python程序的输入。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注