Python实战项目总结
项目:处理超市营业额。
题目:一:已知文件“超市营业额2.xlsx”,将所有员工的工号前面增加一位数字,增加的数字和原工号最后一位相同,把修改好的数据写入新文件“超市营业额2_修改工号.xlsx”。例如,工号1001改为11001,1003改为31003。
1:如何实现对工号的修改:
观察发现可以将工号除以10的余数乘1000,再加上原来的工号。
即:new_num=(old_num)%10*10000+old_num
2:如何处理xlsx文件:
使用openyxl模块。
wb=openpyxl.load_workbook('超市营业额2.xlsx') #打开表格文件
worksheet=wb["Sheet1"] #访问工作表Sheet1
3:如何遍历特定的行或列?
笔者目前正在学pandas,还未初步掌握,所以在这里采用暴力for循环方式。
for i in list(worksheet.columns)[0]:
if i.value!='工号':
new_num = int(i.value) % 10*10000+int(i.value)
new_num_list.append(new_num)
引申:获取特定行或列的方式:
我们可以想到的是用“索引”的方式,但是sheet.rows是生成器类型,不能使用索引。所以我们将其转换为list之后再使用索引,例如用list(sheet.rows)[3]来获取第四行的tuple对象。
#输出特定的行
for cell in list(worksheet.rows)[3]: #获取第四行的数据
print(cell.value,end=" ")
print()
#河北省 1514.7 2039.6 107.7 139.8 915.5 167.9 531.7 115.8 285.7 265.4 166.3 47.0
#输出特定的列
for cell in list(worksheet.columns)[2]: #获取第三列的数据
print(cell.value,end=" ")
print()
#家庭经营纯收入 1957.1 2707.4 2039.6 1622.9 2406.2 2210.8 2556.7 2521.5 767.7 2271.4 3084.3……
#已经转换成list类型,自然是从0开始计数。
PS:引申部分摘编自TheGkenoe博主的文章。
4:如何写入新的文件?
newworksheet.cell(j + 1, 2, new_name_list[j])
for j in range(len(new_num_list)):
newworksheet.cell(j + 1, 1, new_num_list[j]) #写入变更后的数据,j+1表示行数,1为列数。
newworksheet.cell(j + 1, 2, new_name_list[j])
newworksheet.cell(j + 1, 3, new_date_list[j])
newworksheet.cell(j + 1, 4, new_time_list[j])
newworksheet.cell(j + 1, 5, new_sales_list[j])
newworksheet.cell(j + 1, 6, new_kind_list[j])
完整代码如下:
'''超市营业额处理之工号修改'''
import openpyxl
wb=openpyxl.load_workbook('超市营业额2.xlsx') #打开表格文件
worksheet=wb["Sheet1"] #访问工作表Sheet1
new_num_list=['工号'] #定义新的列表用来存储改变后的数据
new_name_list=['姓名']
new_date_list=['日期']
new_time_list=['时段']
new_sales_list=['交易额']
new_kind_list=['柜台']
wb2=openpyxl.Workbook()
newworksheet=wb2.active
newworksheet.title="New Sheet1"
for i in list(worksheet.columns)[0]:
if i.value!='工号':
new_num = int(i.value) % 10*10000+int(i.value)
new_num_list.append(new_num)
for i in list(worksheet.columns)[1]:
if i.value!='姓名':
new_name_list.append(i.value)
for i in list(worksheet.columns)[2]:
if i.value!='日期':
new_date_list.append(i.value)
for i in list(worksheet.columns)[3]:
if i.value!='时段':
new_time_list.append(i.value)
for i in list(worksheet.columns)[4]:
if i.value!='交易额':
new_sales_list.append(i.value)
for i in list(worksheet.columns)[5]:
if i.value!='柜台':
new_kind_list.append(i.value)
for j in range(len(new_num_list)):
newworksheet.cell(j + 1, 1, new_num_list[j]) #写入变更后的数据,j+1表示行数,1为列数。
newworksheet.cell(j + 1, 2, new_name_list[j])
newworksheet.cell(j + 1, 3, new_date_list[j])
newworksheet.cell(j + 1, 4, new_time_list[j])
newworksheet.cell(j + 1, 5, new_sales_list[j])
newworksheet.cell(j + 1, 6, new_kind_list[j])
wb2.save(filename='超市营业额2_修改工号.xlsx')