Python中什麼是配置檔案,配置檔案如何使用,有哪些支援的配置檔案等内容,話不多說,讓我們一起看看吧~
1 什麼是配置檔案?
配置檔案是用于配置計算機程式的參數和初始化設定的檔案,如果沒有這些配置程式可能無法運作或是影響運作(運作速度、便捷性等),使用配置檔案的好處在于,部分内容以及環境運作時隻需要修改配置檔案的參數内容,而無需去代碼裡查找并修改,提高便捷性、提高可維護性。
2 配置檔案有哪幾種?
配置主要有四種形式:
- 第一種是YAML、JSON、XML、TOML、INI、Linux系統中的.bashrc一類,主要應用于軟體測試領域,在軟體測試的領域行業中,大多數公司采用最新的YAML形式來作為配置檔案,例如資料庫位址、用例資料等内容的存放,而少部分公司仍然采用舊的INI配置形式
- 第二種是excel表格的形式,在excel表格中會有固定的title代表每個字段列的含義,有多列,以此來進行配置,多用于遊戲領域中,在遊戲行業大量使用excel表格的形式,已經是一個常态了。
- 第三種是py檔案,py檔案對于一個純Python項目而言是非常友善的,它不需要做資料的讀取操作,隻需要進行導入即可,不好的點在于,沒有YAML這一類靈活,YAML配置檔案無論是Python、Java等語言,都是支援的,且資料類型支援很多,而py的配置檔案,就隻能用作于python,有一定的局限性。
- 第四種是txt文本格式,通過讀取的方式來識别到txt文本内容,通常而言是測開或者測試工程師制作的簡便工具,供給業務層面的測試人員進行使用,降低了YAML這種配置的了解難度,也避免了打開excel的緩慢,用輕量級txt來代替是一個不錯的選擇。
2.1 ini
python3自帶的ini
.ini 檔案是Initialization File的縮寫,即初始化檔案,是windows的系統配置檔案所采用的存儲格式,統管windows的各項配置
2.1.1 ini檔案的定義
.ini 檔案通常由節(Section)、鍵(key)和值(value)組成。具體形式如下:
db.ini
[mysql]
host = 127.0.0.1
port = 3306
user = root
password = 123456
database = test
2.1.2 python讀取ini檔案
使用python内置的 configparser 标準庫進行解析ini檔案。
read() 讀取檔案内容 items() 擷取指定節的所有鍵值對
# -*- coding: utf-8 -*-
'''
* @Author : wxy
* @Date : 2022-08-24 11:11:06
* @Description : 讀取ini檔案
* @LastEditTime : 2022-08-24 11:11:06
'''
from configparser import ConfigParser
from pprint import pprint
import pymysql
# ini檔案路徑
ini_file = './db.ini'
# 讀取ini的節(Section)
db_name = 'mysql'
# configparser執行個體化
text = ConfigParser()
# 讀取ini檔案内容
text.read(ini_file)
# text.items()傳回list,元素為tuple,元組格式為 key,value
db_tuple = text.items(db_name)
print(db_tuple)
# 将元組轉換成dict
db_dict = dict(text.items(db_name))
print(db_dict)
2.2 json
JSON(JavaScript Object Notation,) 是一種輕量級的資料交換格式。
2.2.1 json檔案的定義
簡單的json示例
{
"mysql": {
"host": "127.0.0.1",
"port": 3306,
"user": "root",
"password": "123456",
"database": "test"
}
}
2.2.2 python讀取json檔案
load() 從json檔案中讀取json格式資料
loads() 将字元串類型資料轉化為json格式資料
dump() 将json格式資料儲存到檔案
dumps() 将json格式資料儲存為字元串類型
# -*- coding: utf-8 -*-
'''
* @Author : wxy
* @Date : 2022-8-24 11:39:44
* @Description : 讀取json檔案
* @LastEditTime : 2022-8-24 11:39:44
'''
import json
from pprint import pprint
import pymysql
json_file = "./db.json"
db_name = "mysql"
web = "web"
with open(json_file) as f:
cfg = json.load(f)[db_name]
print(cfg)
with open(json_file) as f:
cfg = json.load(f)[web]
print(cfg['user'])
2.3 toml
TOML 是 Github 聯合創始人 Tom Preston-Werner 所提出的一種配置檔案格式,是一種旨在成為一個小規模、易于使用的語義化的配置檔案格式,它被設計為可以無二義性的轉換為一個哈希表。
2.3.1 定義toml檔案
文法:
TOML的文法廣泛地由key = “value”、[節名]、#注釋構成。
支援以下資料類型:字元串、整形、浮點型、布爾型、日期時間、數組和圖表。
# db.toml
[mysql]
[mysql.config]
host = "127.0.0.1"
user = "root"
port = 3306
password = "123456"
database = "test"
[mysql.parameters]
pool_size = 5
charset = "utf8"
[mysql.fields]
course_cols = ["cno", "cname", "ccredit", "cdept"]
2.3.2 python讀取toml檔案
使用外部庫 toml 解析toml檔案
# -*- coding: utf-8 -*-
'''
* @Description : 讀取toml檔案
* @LastEditTime : 2022-08-14 11:31:07
'''
import toml
from pprint import pprint
import pymysql
toml_file = "./db.toml"
cfg = toml.load(toml_file)['mysql']
pprint(cfg)
2.4 yaml
YAML(YAML Ain’t a Markup Language”, YAML不是一種标記語言) 格式是目前較為流行的一種配置檔案,它早在 2001 由一個名為 Clark Evans 的人提出;同時它也是目前被廣泛使用的配置檔案類型。
2.4.1 定義yaml檔案
# db.yaml
mysql:
config:
host: "127.0.0.1"
port: 3306
user: "root"
password: ""
database: "stu_sys"
parameters:
pool_size: 5
charset: "utf8"
fileds:
course_cols:
- cno
- cname
- ccredit
- cdept
2.4.2 python讀取yaml檔案
使用外部庫 pyyaml 解析toml檔案。
# -*- coding: utf-8 -*-
'''
* @Author : wxy
* @Date : 2022-8-24 11:34:37
* @Description : 讀取yaml檔案
* @LastEditTime : 2022-8-24 11:34:37
'''
import yaml
from pprint import pprint
import pymysql
yaml_file = "./db.yaml"
with open(yaml_file, 'r') as f:
cfg = yaml.safe_load(f)
print(cfg)
2.5 Python xlrd 讀取 操作Excel
python Excel庫對比
本次主要關注python xlrd讀取 操作excel
2.5.1 xlrd子產品介紹
1.什麼是xlrd子產品?
python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。
2.為什麼使用xlrd子產品?
在UI自動化或者接口自動化中資料維護是一個核心,是以此子產品非常實用。
xlrd子產品可以用于讀取Excel的資料,速度非常快,推薦使用!
官方文檔:https://xlrd.readthedocs.io/en/latest/
2.5.2 安裝xlrd子產品
到python官網下載下傳http://pypi.python.org/pypi/xlrd 子產品安裝,前提是已經安裝了python 環境。
或者在cmd視窗 pip install xlrd
最新的xlrd不支援Excel xlsx檔案的讀取。是以需要安裝舊版本 pip install xlrd==1.2.0
2.5.3 使用介紹
1.常用單元格的資料類型
- empty(空的)
- string(text)
- number
- date
- boolean
- error
- blank(空白表格)
2.導入子產品
import xlrd
3.打開Excel檔案讀取資料
data = xlrd.open_workbook(filename)#檔案名以及路徑,如果路徑或者檔案名有中文給前面加一個 r
4.常用的函數
excel中最重要的方法就是book和sheet的操作
- 擷取book(excel檔案)中一個工作表
table = data.sheets()[0] #通過索引順序擷取
table = data.sheet_by_index(sheet_indx) #通過索引順序擷取
table = data.sheet_by_name(sheet_name) #通過名稱擷取
# 以上三個函數都會傳回一個xlrd.sheet.Sheet()對象
names = data.sheet_names() #傳回book中所有工作表的名字
data.sheet_loaded(sheet_name or indx) # 檢查某個sheet是否導入完畢
- 行的操作
nrows = table.nrows
# 擷取該sheet中的行數,注,這裡table.nrows後面不帶().
table.row(rowx)
# 傳回由該行中所有的單元格對象組成的清單,這與tabel.raw()方法并沒有差別。
table.row_slice(rowx)
# 傳回由該行中所有的單元格對象組成的清單
table.row_types(rowx, start_colx=0, end_colx=None)
# 傳回由該行中所有單元格的資料類型組成的清單;
# 傳回值為邏輯值清單,若類型為empy則為0,否則為1
table.row_values(rowx, start_colx=0, end_colx=None)
# 傳回由該行中所有單元格的資料組成的清單
table.row_len(rowx)
# 傳回該行的有效單元格長度,即這一行有多少個資料
- 列(colnum)的操作
ncols = table.ncols
# 擷取清單的有效列數
table.col(colx, start_rowx=0, end_rowx=None)
# 傳回由該列中所有的單元格對象組成的清單
table.col_slice(colx, start_rowx=0, end_rowx=None)
# 傳回由該列中所有的單元格對象組成的清單
table.col_types(colx, start_rowx=0, end_rowx=None)
# 傳回由該列中所有單元格的資料類型組成的清單
table.col_values(colx, start_rowx=0, end_rowx=None)
# 傳回由該列中所有單元格的資料組成的清單
- 單元格的操作
table.cell(rowx,colx)
# 傳回單元格對象
table.cell_type(rowx,colx)
# 傳回對應位置單元格中的資料類型
table.cell_value(rowx,colx)
# 傳回對應位置單元格中的資料
2.5.4 實戰訓練
使用xlrd子產品進行讀取:
import xlrd
xlsx = xlrd.open_workbook('./3_1 xlrd 讀取 操作練習.xlsx')
# 通過sheet名查找:xlsx.sheet_by_name("sheet1")
# 通過索引查找:xlsx.sheet_by_index(3)
table = xlsx.sheet_by_index(0)
# 擷取單個表格值 (2,1)表示擷取第3行第2列單元格的值
value = table.cell_value(2, 1)
print("第3行2列值為",value)
# 擷取表格行數
nrows = table.nrows
print("表格一共有",nrows,"行")
# 擷取第4列所有值(清單生成式)
name_list = [str(table.cell_value(i, 3)) for i in range(1, nrows)]
print("第4列所有的值:",name_list)
2.6 Python xlwt 寫入 操作Excel(僅限xls格式!)
xlwt可以用于寫入新的Excel表格或者在原表格基礎上進行修改,速度也很快,推薦使用!
官方文檔:https://xlwt.readthedocs.io/en/latest/
2.6.1 pip安裝xlwt
pip install xlwt
2.6.2 使用xlwt建立新表格并寫入
編寫xlwt新表格寫入程式:
# 3.2.2 使用xlwt建立新表格并寫入
def fun3_2_2():
# 建立新的workbook(其實就是建立新的excel)
workbook = xlwt.Workbook(encoding= 'ascii')
# 建立新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格寫入内容
worksheet.write(0,0, "内容1")
worksheet.write(2,1, "内容2")
# 儲存
workbook.save("新建立的表格.xls")
2.6.3 xlwt 設定字型格式
程式示例:
# 3.2.3 xlwt設定字型格式
def fun3_2_3():
# 建立新的workbook(其實就是建立新的excel)
workbook = xlwt.Workbook(encoding= 'ascii')
# 建立新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 初始化樣式
style = xlwt.XFStyle()
# 建立字型樣式
font = xlwt.Font()
font.name = 'Times New Roman' #字型
font.bold = True #加粗
font.underline = True #下劃線
font.italic = True #斜體
# 設定樣式
style.font = font
# 往表格寫入内容
worksheet.write(0,0, "内容1")
worksheet.write(2,1, "内容2",style)
# 儲存
workbook.save("新建立的表格.xls")
# 設定列寬
worksheet.col(0).width = 256*20
# 設定行高
style = xlwt.easyxf('font:height 360;') # 18pt,類型小初的字号
row = worksheet.row(0)
row.set_style(style)
# 合并 第1行到第2行 的 第0列到第3列
worksheet.write_merge(1, 2, 0, 3, 'Merge Test')
# 設定邊框樣式
borders = xlwt.Borders() # Create Borders
borders.left = xlwt.Borders.DASHED
borders.right = xlwt.Borders.DASHED
borders.top = xlwt.Borders.DASHED
borders.bottom = xlwt.Borders.DASHED
borders.left_colour = 0x40
borders.right_colour = 0x40
borders.top_colour = 0x40
borders.bottom_colour = 0x40
2.7 Python xlutils 修改 操作Excel
xlutils可用于拷貝原excel或者在原excel基礎上進行修改,并儲存;
官方文檔:https://xlutils.readthedocs.io/en/latest/
2.7.1 pip安裝xlutils
pip install xlutils
2.7.2 xlutils拷貝源檔案(需配合xlrd使用)
程式示例:
# 3.3.2 拷貝源檔案
def fun3_3_2():
workbook = xlrd.open_workbook('3_3 xlutils 修改操作練習.xlsx') # 打開工作簿
new_workbook = copy(workbook) # 将xlrd對象拷貝轉化為xlwt對象
new_workbook.save("new_test.xls") # 儲存工作簿
2.7.3 xlutils 讀取 寫入 (也就是修改)Excel 表格資訊
程式示例:
# 3.3.3 xlutils讀取 寫入 Excel 表格資訊
def fun3_3_3():
# file_path:檔案路徑,包含檔案的全名稱
# formatting_info=True:保留Excel的原格式(使用與xlsx檔案)
workbook = xlrd.open_workbook('3_3 xlutils 修改操作練習.xlsx')
new_workbook = copy(workbook) # 将xlrd對象拷貝轉化為xlwt對象
# 讀取表格資訊
sheet = workbook.sheet_by_index(0)
col2 = sheet.col_values(1) # 取出第二列
cel_value = sheet.cell_value(1, 1)
print(col2)
print(cel_value)
# 寫入表格資訊
write_save = new_workbook.get_sheet(0)
write_save.write(0, 0, "xlutils寫入!")
new_workbook.save("new_test.xls") # 儲存工作簿
2.8 Python xlwings 讀取 寫入 修改 操作Excel
2.8.1 pip安裝xlwings
pip install xlwings
2.8.2 基本操作
引入庫
import xlwings as xw
(1)打開已存在的Excel文檔
# 導入xlwings子產品
import xlwings as xw
# 打開Excel程式,預設設定:程式可見,隻打開不建立工作薄,螢幕更新關閉
app=xw.App(visible=True,add_book=False)
app.display_alerts=False
app.screen_updating=False
# 檔案位置:filepath,打開test文檔,然後儲存,關閉,結束程式
filepath=r'g:\Python Scripts\test.xlsx'
wb=app.books.open(filepath)
wb.save()
wb.close()
app.quit()
(2)建立Excel文檔,命名為test.xlsx,并儲存在D盤
import xlwings as xw
app=xw.App(visible=True,add_book=False)
wb=app.books.add()
wb.save(r'd:\test.xlsx')
wb.close()
app.quit()
(3) xlwings 讀寫 Excel
建立test.xlsx,在sheet1的第一個單元格輸入 “人生” ,然後儲存關閉,退出Excel程式。
def fun3_4_4():
# 建立Excle 預設設定:程式可見,隻打開不建立工作薄,螢幕更新關閉
app = xw.App(visible=True, add_book=False)
app.display_alerts = False
app.screen_updating = False
# 打開已存在的Excel檔案
wb=app.books.open('./3_4 xlwings 修改操作練習.xlsx')
# 擷取sheet對象
print(wb.sheets)
sheet = wb.sheets[0]
# sheet = wb.sheets["sheet1"]
# 讀取Excel資訊
cellB1_value = sheet.range('B1').value
print("單元格B1内容為:",cellB1_value)
# 清除單元格内容和格式
sheet.range('A1').clear()
# 寫入單元格
sheet.range('A1').value = "xlwings寫入"
# 儲存工作簿
wb.save('example_3.xlsx')
# 退出工作簿
wb.close()
# 退出Excel
app.quit()l
2.9 Python openpyxl 讀取 寫入 修改 操作Excel
在openpyxl中,主要用到三個概念:Workbooks,Sheets,Cells。
Workbook就是一個excel工作表;
Sheet是工作表中的一張表頁;
Cell就是簡單的一個格。
openpyxl就是圍繞着這三個概念進行的,不管讀寫都是“三闆斧”:打開Workbook,定位Sheet,操作Cell。
官方文檔:https://openpyxl.readthedocs.io/en/stable/
1.安裝
pip install openpyxl
2.打開檔案
(1)建立
from openpyxl import Workbook
# 執行個體化
wb = Workbook()
# 激活 worksheet
ws = wb.active
(2)打開已有
from openpyxl import load_workbook
wb = load_workbook('檔案名稱.xlsx')
3.寫入資料
# 方式一:資料可以直接配置設定到單元格中(可以輸入公式)
ws['A1'] = 42
# 方式二:可以附加行,從第一列開始附加(從最下方空白處,最左開始)(可以輸入多行)
ws.append([1, 2, 3])
# 方式三:Python 類型會被自動轉換
ws['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")
4.建立表(sheet)
# 方式一:插入到最後(default)
ws1 = wb.create_sheet("Mysheet")
# 方式二:插入到最開始的位置
ws2 = wb.create_sheet("Mysheet", 0)
5.選擇表(sheet)
# sheet 名稱可以作為 key 進行索引
>>> ws3 = wb["New Title"]
>>> ws4 = wb.get_sheet_by_name("New Title")
>>> ws is ws3 is ws4
True
6.檢視表名(sheet)
# 顯示所有表名
>>> print(wb.sheetnames)
['Sheet2', 'New Title', 'Sheet1']
# 周遊所有表
>>> for sheet in wb:
... print(sheet.title)
7.儲存資料
wb.save('檔案名稱.xlsx')
8.其它
(1)改變sheet标簽按鈕顔色
ws.sheet_properties.tabColor = "1072BA" # 色值為RGB16進制值
(2)擷取最大行,最大列
# 獲得最大列和最大行
print(sheet.max_row)
print(sheet.max_column)
(3)擷取每一行每一列
sheet.rows為生成器, 裡面是每一行的資料,每一行又由一個tuple包裹。
sheet.columns類似,不過裡面是每個tuple是每一列的單元格。
# 因為按行,是以傳回A1, B1, C1這樣的順序
for row in sheet.rows:
for cell in row:
print(cell.value)
# A1, A2, A3這樣的順序
for column in sheet.columns:
for cell in column:
print(cell.value)
(4)根據數字得到字母,根據字母得到數字
from openpyxl.utils import get_column_letter, column_index_from_string
# 根據列的數字傳回字母
print(get_column_letter(2)) # B
# 根據字母傳回列的數字
print(column_index_from_string('D')) # 4
(5)删除工作表
# 方式一
wb.remove(sheet)
# 方式二
del wb[sheet]
項目實操—-UI自動化中實踐項目
需求:業務寫入揀貨容器,使用一次不可使用第二次,且腳本中固定讀取固定位置
import openpyxl
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE
from openpyxl.utils import get_column_letter, column_index_from_string
# 向sheetobj中的columnname列從start_row開始寫入listdata
def insert_listdata_to_column(sheetobj,listdata,column_name,start_row=3):
# 根據列名擷取列索引
colindex = column_index_from_string(column_name)
print('colindex為{}'.format(colindex))
# 循環從開始行數到資料寫入後最後一行
for rowindex in range(start_row, start_row + len(listdata)):
# 寫入list數值根據索引取值,從0開始
val = listdata[rowindex - start_row]
print('val{}'.format(val))
print('rowindex{}'.format(rowindex))
try:
sheetobj.cell(row = rowindex,column = colindex,value = val)
except:
# 出現非法字元時,可以将字元串的非法字元替換掉
val = ILLEGAL_CHARACTERS_RE.sub(r'',val)
sheetobj.cell(row = rowindex,column = colindex,value = val)
delrow = start_row + len(listdata)
print('*********{}'.format(delrow))
sheetobj.delete_rows(delrow)
def del_excel():
xlsx = xlrd.open_workbook(r'D:\pytest\inbound_data.xlsx')
table =xlsx.sheet_by_index(2)
# 擷取第2列所有值
cel_value =table.col_values(1)
cel_value=cel_value[3::]
wb = openpyxl.load_workbook(r'D:\pytest\inbound_data.xlsx')
sheet = wb["B2B出庫"]
print(sheet)
insert_listdata_to_column(sheet,cel_value,'B',3)
wb.save(r'D:\pytest\inbound_data.xlsx')
del_excel()
3 總結
在本文中,簡單介紹了幾種配置檔案和使用。根據不同的用例,複雜的工具/架構并不總是比簡單的軟體包更好。但無論選擇哪一種,都應始終考慮可讀性,可維護性以及如何盡早地發現錯誤。事實上,可以說配置檔案隻是另一種類型的代碼。可以根據自己的項目架構來靈活運用啦~
作者:京東物流 王小雲
來源:京東雲開發者社群