案例故事: Testlink匯入xml格式的用例程序中,還會碰到一個小問題:
如何盡量確保生成的xml盡量小于400kb呢,只能考慮對excel進行切割拆分了,
以下案例假設一個大的測驗模塊的Excel,內含1000條用例,
需要考慮用Python實作切割,切割拆分成5個子excel,每個Excel是200條左右,
當然如果某個測驗模塊的Excel,只包含200條以內的用例,肯定用不著切割了,
:::
::: tips 本案例不再考慮input.xlsx, output_1/2/3/4/5.xlsx這種輸入輸出的思維,
而采用python cut_excel.py 1000.xlsx 200 類似這種引數輸入處理的形式,
其實很多命令列工具都是采用以上這種多引數實作處理的,比如adb, ffmpeg等,
:::
準備階段
- 準備一個包含1000條用例的excel表格,名字不限制,
比如取名為:1000.xlsx, 我們計劃切割成5個小的Excel,每個Excel 200條, - 引數輸入,肯定涉及sys模塊的argv引數的使用,以下是argv的使用示例:
| 命令 | 引數決議 |
|---|---|
| python cut_excel.py 1000.xlsx 200 | sys.argv=["cut_excel.py","1000.xlsx","200"]即: 引數0:"cut_excel.py" 引數1:"1000.xlsx" 引數2: "200" 備注:其實將cut_excel.py編譯打包成cut_excel.exe就和以下adb.exe一樣了, |
| adb logcat -v time | sys.argv=["adb","logcat","-v", "time"] 即: 引數0:"adb" 引數1:"logcat" 引數2: "-v" 引數3:"time" |
Python批處理腳本形式
記住批處理腳本的精髓:批量順序執行陳述句
# coding=utf-8
import os
import sys
import openpyxl
excel_file = sys.argv[1] # 需要切割拆分的excel檔案
limit = int(sys.argv[2]) # 以多少行為一個切割單位限制,比如200行作為一個單位限制
excel = openpyxl.load_workbook(excel_file)
_, excel_name = os.path.split(excel_file)
sheet = excel.active
max_rows = sheet.max_row
# 如果行數太大了,比設定的單位限制還小或者相等,當然無法切割了,
if max_rows <= limit:
print("你設定的切割單位太大了,無法進行切割拆分, 必須小于excel行數%s" % max_rows)
sys.exit() # 直接退出程式
# 獲取所有的行,并放到一個字典去,
excel_dict = {}
row_num = 1
for row in sheet.iter_rows():
temp_list = []
for cell in row:
temp_list.append(cell.value)
excel_dict[row_num] = temp_list
row_num = row_num + 1
# 切割(拆分)并填充到新的excel里去,
start_row = 1
for i in range(0, int(max_rows / limit) + 1): # 新建倍數個檔案
part_excel = openpyxl.Workbook() # 初始化一個空表
part_sheet = part_excel.active
if start_row != 1: # 如果不是第一行
part_sheet.append(excel_dict[1]) # 寫入第一行標題行
for j in range(start_row, (i + 1) * limit + 1):
try: # 如果最后可能沒到unit_num的倍數,則捕捉例外,直接pass
part_sheet.append(excel_dict[j]) # 寫入其他行
except:
pass
save_file = "%s_%s_%s.xlsx" % (excel_name, start_row, (i + 1) * limit)
part_excel.save(save_file) # 保存表格,
print("已經切割并保存到了:%s" % save_file)
start_row = start_row + limit # 繼續下一個單位倍數,
os.system("pause")
Python面向程序函式形式
面向程序函式的編程思維應該是這樣的:
你需要多少個功能(函式),才能做成這個事,
最好把功能(函式)都盡量封裝好,只暴露一些的引數介面即可,
# coding=utf-8
import os
import sys
import openpyxl
def _get_excel_dict(sheet):
"""獲取所有的行,并放到一個字典去"""
excel_dict = {}
row_num = 1
for row in sheet.iter_rows():
temp_list = []
for cell in row:
temp_list.append(cell.value)
excel_dict[row_num] = temp_list
row_num = row_num + 1
return excel_dict
def cut_excel(excel_file, limit):
"""切割(拆分)并填充到新的excel里去"""
excel = openpyxl.load_workbook(excel_file)
_, excel_name = os.path.split(excel_file)
sheet = excel.active
max_rows = sheet.max_row
# 如果行數太少了,比設定的單位限制還小或者相等,當然無法切割了,
if max_rows <= limit:
print("你設定的切割單位太大了,無法進行切割拆分, 必須小于excel行數%s" % max_rows)
sys.exit() # 直接退出程式
excel_dict = _get_excel_dict(sheet)
start_row = 1
for i in range(0, int(max_rows / limit) + 1): # 新建倍數個檔案
part_excel = openpyxl.Workbook() # 初始化一個空表
part_sheet = part_excel.active
if start_row != 1: # 如果不是第一行
part_sheet.append(excel_dict[1]) # 寫入第一行標題行
for j in range(start_row, (i + 1) * limit + 1):
try: # 如果最后可能沒到unit_num的倍數,則捕捉例外,直接pass
part_sheet.append(excel_dict[j]) # 寫入其他行
except:
pass
save_file = "%s_%s_%s.xlsx" % (excel_name, start_row, (i + 1) * limit)
part_excel.save(save_file) # 保存表格,
print("已經切割并保存到了:%s" % save_file)
start_row = start_row + limit # 繼續下一個單位倍數,
excel_file = sys.argv[1] # 需要切割拆分的excel檔案
limit = int(sys.argv[2]) # 以多少行為一個單位限制,比如以200行作為一個單位限制
cut_excel(excel_file, limit)
os.system("pause")
Python面向物件類形式
面向物件類的編程思維應該是這樣的:
如果給你一個空白的世界,在這個世界里你需要哪些種類的事物,
這些種類的事物都具備哪些共有的屬性與方法,
這些種類(類)的事物(物件),和其他種類(其他類)的事物(其他物件)有什么關系,
盡量把這些類封裝好,只暴露對外的屬性(變數)和方法(函式)即可,
# coding=utf-8
import os
import sys
import openpyxl
class ExcelCutter(object):
def __init__(self, excel_file):
self.excel_file = excel_file
def __get_excel_dict(self, sheet):
"""獲取所有的行,并放到一個字典去"""
excel_dict = {}
row_num = 1
for row in sheet.iter_rows():
temp_list = []
for cell in row:
temp_list.append(cell.value)
excel_dict[row_num] = temp_list
row_num = row_num + 1
return excel_dict
def cut_excel(self, limit):
"""切割(拆分)并填充到新的excel里去"""
excel = openpyxl.load_workbook(self.excel_file)
_, excel_name = os.path.split(self.excel_file)
sheet = excel.active
max_rows = sheet.max_row
# 如果行數太大了,比設定的單位限制還小或者相等,當然無法切割了,
if max_rows <= limit:
print("你設定的切割單位太大了,無法進行切割拆分, 必須小于excel行數%s" % max_rows)
sys.exit() # 直接退出程式
excel_dict = self.__get_excel_dict(sheet)
start_row = 1
for i in range(0, int(max_rows / limit) + 1): # 新建倍數個檔案
part_excel = openpyxl.Workbook() # 初始化一個空表
part_sheet = part_excel.active
if start_row != 1: # 如果不是第一行
part_sheet.append(excel_dict[1]) # 寫入第一行標題行
for j in range(start_row, (i + 1) * limit + 1):
try: # 如果最后可能沒到unit_num的倍數,則捕捉例外,直接pass
part_sheet.append(excel_dict[j]) # 寫入其他行
except:
pass
save_file = "%s_%s_%s.xlsx" % (excel_name, start_row, (i + 1) * limit)
part_excel.save(save_file) # 保存表格,
print("已經切割并保存到了:%s" % save_file)
start_row = start_row + limit # 繼續下一個單位倍數,
if __name__ == '__main__':
excel_file = sys.argv[1] # 需要切割拆分的excel檔案
limit = int(sys.argv[2]) # 以多少行為一個單位限制,比如以200行作為一個單位限制
e_obj = ExcelCutter(excel_file)
e_obj.cut_excel(limit)
os.system("pause")
本案例素材下載
包括:一份待切割的1000條的測驗用例,Python腳本
跳轉到自拍教程官網下載
武散人出品,請放心下載!
運行方式與效果
以上代碼的3種實作形式都可以直接運行,比如保存為cut_excel.py并放在桌面,
cmd運行: python cut_excel.py D:\tttt\cut_excel\vts.xlsx 200,
類似這樣運行,注意引數1:Excel檔案的絕對路徑,
運行效果及拆分效果:
代碼優化方向
可以考慮對引數1, 引數2的健壯性性進行完善,
比如引數2,必須要是數字,如果不是數字,則需要給到必要的提示并退出程式,
更多更好的原創文章,請訪問官方網站:www.zipython.com
自拍教程(自動化測驗Python教程,武散人編著)
原文鏈接:https://www.zipython.com/#/detail?id=46c29fcb25af42e9b7dde45109a0d0ac
也可關注“武散人”微信訂閱號,隨時接受文章推送,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/148781.html
標籤:Python
上一篇:Django 配置JWT認證方式
下一篇:Python 元組資料型別(tuple)詳解 [訪問元組元素][修改元組元素][洗掉元組][學習 Python 必備基礎知識][看此一篇就夠了]
