将值分组,创建总和并写入Excel,Python

时间:2011-10-10 01:13:12

标签: python dictionary xlwt

我正在整理一个脚本,从访问表中获取一些数据并将其写入excel表。在这个过程中,我正在尝试格式化表格。我已将excel表的输出粘贴到我的脚本下面。

在下面的脚本中,我从访问表中提取数据并将其放入excel表中。它将第一列中的所有值分组(即所有M1,所有M20a,等等)。第二栏是以公顷为单位的相关区域。第三列是每个分组值的面积之和。

除了最后一组(ZWA)之外,所有区域的总和都是正确的并且在正确的位置。它没有写出该值的总和。我有一种感觉,我需要设置脚本,以便它检测到表中的最后一行。

import arcpy, xlwt, sys, traceback, datetime
from arcpy import env
from xlwt import *
from itertools import groupby
from collections import defaultdict
from time import strftime


# Set workspace for the file to be used
env.workspace = "Z:\TestFolder"
env.overwriteOutput = True


# Stores access table into a variable and sorts the SMU field ascendingly
cur = arcpy.SearchCursor("Access Table", "", "", "SMU", "SMU A")

# Create excel workbook
book = Workbook()
sheet1 = book.add_sheet('Sheet 1')

# Create a dictionary
col_counts = defaultdict(int)

# Set a varialb eto be used in looping through rwos and detecting when the value in the cell is different from the last
last_value = object()

# Set the start of 2 counters. rowx is to count rows in the access table. rowadd is to add the values in a field alled row.SHAPE_Area
rowx = 3
rowadd = 0

# Loop through the access table
for row in cur:

    # Ask if the current value is not equal to the last value in the row.SMU column
    if row.SMU != last_value:

        last_value = row.SMU

        # if the current value doesn't equal the last value, then place the sum of the row.SHAPE_Area field for the last value in a new cell in a different column.
        sheet1.write(int(rowx+1),3,rowadd/10000)

        # Reset counter to 0
        rowadd = 0
        # Add 2 to the counter to create a space between groups of values in the excel table
        rowx += 2
    else:
        # Else only add 1 to the counter if the value in the cell reamisn the same as the last one
        rowx += 1


    # if the value of the row is the same as the last one, then add the values for a second column together and write to the excel sheet
    if row.SMU == str(last_value):

        rowadd += row.SHAPE_Area
        print rowadd

        sheet1.write(int(rowx),0,row.SMU)
        sheet1.write(int(rowx),1,row.SHAPE_Area/10000)

# Set the counter to += the last value in the (col_counts[last_value]) variable and start over again
rowx += (col_counts[last_value])

# Save the workbook
book.save("Z:\TestFolder\simple.xls")

下面是excel中的输出表。看到我没有在第三列中获得ZWA总面积。谁能说明为什么会这样?我想摆脱第三列第一行的0。

                      0
M1      0.076492721     
M1      0.406600839     
M1      2.98016238      
                      3.46325594
M20a    0.665489193     
                      0.665489193
M21     0.005333282     
                      0.005333282
M23b    0.190245719     
M23b    0.233315779     
                      0.423561498
S1      0.201021287     
S1      0.176390376     
S1      0.200409435     
S1      0.009312814     
S1      0.071782163     
                      0.658916076
ZWA     0.387293182     

1 个答案:

答案 0 :(得分:0)

您需要类似下面的(未经测试的)代码。

import arcpy, xlwt, sys, traceback, datetime
from arcpy import env
#### from xlwt import *
#### (a) horrid, you need only 1 class (b) you already imported xlwt
### from itertools import groupby
#### good idea, but get some simple programming skills first
#### from collections import defaultdict #### why?
from time import strftime

# Set workspace for the file to be used
env.workspace = "Z:\TestFolder"
env.overwriteOutput = True

# Stores access table into a variable and sorts the SMU field ascendingly
cur = arcpy.SearchCursor("Access Table", "", "", "SMU", "SMU A")

# Create excel workbook
book = Workbook()
sheet1 = book.add_sheet('Sheet 1')

# Create a dictionary #### what for?
col_counts = defaultdict(int)

# Set a varialb eto be used in looping through rwos
# and detecting when the value in the cell is different from the last
previous = dummy = object()

# Set the start of 2 counters.
# rowx is to count rows in the excel table, NOT the access table
# rowadd is to add the values in a field alled row.SHAPE_Area
rowx = 3
rowadd = 0
# Loop through the access table
for row in cur:
    if row.SMU != previous != dummy:
        # if the current value doesn't equal the previous value,
        # AND it's not the first row, then place
        # the sum of the row.SHAPE_Area field for the previous value
        # in a new cell in a different column.
        rowx += 1 # start a new output row
        sheet1.write(rowx, 3, rowadd/10000)
        # Reset counter to 0
        rowadd = 0
    rowx += 1 # start a new output row
    rowadd += row.SHAPE_Area
    print rowadd
    sheet1.write(rowx, 0, row.SMU)
    sheet1.write(rowx, 1, row.SHAPE_Area/10000)
    previous = row.SMU

# End of input. Write the final subtotal (unless there was no input)
if previous != dummy:
    rowx += 1
    sheet1.write(rowx, 3, rowadd/10000)

##### What is the purpose of this???    
# Set the counter to += the last value in the
# (col_counts[previous]) variable and start over again
rowx += (col_counts[previous])

# Save the workbook
book.save(r"Z:\TestFolder\simple.xls")