欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python实现从excel读取数据进行批量get请求

程序员文章站 2024-03-21 23:48:58
...

会了用python操作excel,就想把参数放到excel中取,然后进行请求,由于for循环用的不是很溜,就想把每一列除列头以外都取出来放在了一个数组中,通过数组下标获取,结果传递时老是报错,又换成直接取单元格数据取出来一样报错:

python实现从excel读取数据进行批量get请求
以上思路代码:
import os
import xlrd
import requests
class readExcel():

def get_caseName(self,xls_name):
    case_name=[]
    xlsPath="D:/Programs/Python/resource/testCase.xlsx"
    #打开用例excel
    file = xlrd.open_workbook(xlsPath)
    #sheet = file.sheet_by_name(sheet_name)  # 获得打开Excel的sheet
    sheet = file.sheet_by_index(0)  # 根据索引获取第一个sheet

    # 获取这个sheet内容行数
    rows = sheet.nrows
    for i in range(rows):  # 根据行数数做循环
        if sheet.row_values(i)[0] != 'case_name':  # 如果这个Excel的这个sheet的第i行的第一列不等于case_name那么我们把这行的数据添加到case_name[]
            case_name.append(sheet.row_values(i)[0])
    return case_name

def get_urlName(self, xls_name):
    url_name = []
    xlsPath = "D:/Programs/Python/resource/testCase.xlsx"
    # 打开用例excel
    file = xlrd.open_workbook(xlsPath)
    sheet = file.sheet_by_index(0)  # 根据索引获取第一个sheet
    # 获取这个sheet内容行数
    rows = sheet.nrows
    for i in range(rows):  # 根据行数数做循环
        if sheet.row_values(i)[1]!='url':# 如果这个Excel的这个sheet的第i行的第一列不等于url那么我们把这行的数据添加到url_name[]
            url_name.append(sheet.row_values(i)[1])
    return url_name

def get_paraName(self, xls_name):
    para_name=[]
    xlsPath = "D:/Programs/Python/resource/testCase.xlsx"
    # 打开用例excel
    file = xlrd.open_workbook(xlsPath)
    sheet = file.sheet_by_index(0)  # 根据索引获取第一个sheet
    # 获取这个sheet内容行数
    rows = sheet.nrows
    for i in range(rows):  # 根据行数数做循环
        if sheet.row_values(i)[2]!='para':# 如果这个Excel的这个sheet的第i行的第3列不等于para那么我们把这行的数据添加到para_name[]
            para_name.append(sheet.row_values(i)[2])
    return para_name
def get_header(self, xls_name):
    header_name=[]
    xlsPath = "D:/Programs/Python/resource/testCase.xlsx"
    # 打开用例excel
    file = xlrd.open_workbook(xlsPath)
    sheet = file.sheet_by_index(0)  # 根据索引获取第一个sheet
    # 获取这个sheet内容行数
    rows = sheet.nrows
    for i in range(rows):  # 根据行数数做循环
        if sheet.row_values(i)[3]!='header':# 如果这个Excel的这个sheet的第i行的第3列不等于para那么我们把这行的数据添加到para_name[]
            header_name.append(sheet.row_values(i)[3])
    return header_name

class HttpTest():
def get(url, para, header):
try:
r = requests.get(url,para, header)
# 响应的json数据转换为可被python识别的数据类型
json_r = r.json()
if r.status_code == 200:
print(“请求成功,结果代码为:”, json_r[“code”])
else:
print(“请求失败!”)
except BaseException as e:
print(“请求异常!”, str(e))

if name == ‘main’: # 我们执行该文件测试一下是否可以正确获取Excel中的值
xlsPath = “D:/Programs/Python/resource/testCase.xlsx”
# 打开用例excel
file = xlrd.open_workbook(xlsPath)
sheet = file.sheet_by_index(0) # 根据索引获取第一个sheet
# 获取这个sheet内容行数
rows = sheet.nrows
for i in range(rows): # 根据行数数做循环
if (sheet.row_values(i)[2]!=‘para’)& (sheet.row_values(i)[1] !=‘url’)&(sheet.row_values(i)[3]!=‘header’):
HttpTest().get(sheet.row_values(i)[1],sheet.row_values(i)[2],sheet.row_values(i)[3])#这个位置被我换成了直接取excel,反正按照数组下标取一样

明明就只传了3个,非说给了4个,python的requets.get方法的参数是字典类型,也知道从excel获取的是str字符串类型,然后就卡住了不知道咋办。只好换了个思路,直接整个完整的贴在excel一列,直接取出来用就解决了。但是多个参数,post请求等还是得分离,放一整个也不智能,跟postman全部建立一遍放集合跑一样道理,还是比较傻瓜。
放完整路径可以成功代码如下:
import os
import xlrd
import requests

if name == ‘main’:
xlsPath = “D:/Programs/Python/resource/gettest.xlsx”
# 打开用例excel
file = xlrd.open_workbook(xlsPath)
# sheet = file.sheet_by_name(sheet_name) # 获得打开Excel的sheet
sheet = file.sheet_by_index(0) # 根据索引获取第一个sheet
# 获取这个sheet内容行数
rows = sheet.nrows
for i in range(rows): # 根据行数数做循环
if sheet.row_values(i)[1] != ‘url’ :#循环判断excel第i行第2列的值
r=requests.get(sheet.row_values(i)[1])#循环取excel第i行第2列的值
# 响应的json数据转换为可被python识别的数据类型
json_r = r.json()
if r.status_code == 200:
print(“请求成功,http状态码为:结果代码为:”,r.status_code, json_r[“code”])
elif r.status_code == 400:
print(“请求参数错误,http状态码为:结果代码为:”, r.status_code)
else:
print(“请求失败!”)

失败原因:
python从excel中解析出来的数据类型不是字典!!,所以无法传递给requests当做请求参数
解决办法:
利用json库的loads方法将数据反序列化

由于我i自己完全小白,python有些什么函数,什么作用都不太清楚,学了一下菜鸟教程,可是没有实际项目写一些东西用,那种基础的根本就理解不深,没大用。只有写了真实的东西来用到了,回头再看基础的定义,理解才会深刻。所以即便我最开始知道传递的是str不是字典也没解决。这个找到的方法我直接贴还是出错,再研究吧。先这样记录一下。
python实现从excel读取数据进行批量get请求

python实现从excel读取数据进行批量get请求
python实现从excel读取数据进行批量get请求

改造了一下可以把响应结果判断存在EXCEL中了,当然写的有点不够简洁,以后熟悉了再优化吧,下一步实现动态取参数,动态断言。
import os
import xlrd
import requests
import xlwt
from xlutils.copy import copy

if name == ‘main’:

# 处理要写入的excel工作簿的信息:
workbook = xlrd.open_workbook('D:/Programs/Python/resource/result.xlsx')  # 打开工作簿
new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个工作表对象


xlsPath = "D:/Programs/Python/resource/gettest.xlsx"
# 打开用例excel
file = xlrd.open_workbook(xlsPath)
# sheet = file.sheet_by_name(sheet_name)  # 获得打开Excel的sheet
sheet = file.sheet_by_index(0)  # 根据索引获取第一个sheet
# 获取这个sheet内容行数
rows = sheet.nrows
for i in range(rows):  # 根据行数数做循环
    if sheet.row_values(i)[1] != 'url' :#循环判断excel第i行第2列的值
        r=requests.get(sheet.row_values(i)[1])#循环取excel第i行第2列的值
        # 响应的json数据转换为可被python识别的数据类型
        json_r = r.json()
        if r.status_code == 200:
            print("请求成功,http状态码为:结果代码为:",r.status_code, json_r["code"])
            new_worksheet.write(i, 4, r.status_code)
            new_worksheet.write(i, 5, r.text)
            new_worksheet.write(i, 6, "pass")
        elif r.status_code == 400:
            print("请求参数错误,http状态码为:结果代码为:", r.status_code)
            new_worksheet.write(i, 4, r.status_code)
            new_worksheet.write(i, 5, r.text)
            new_worksheet.write(i, 6, "fail")
        else:
            print("请求失败!")
            new_worksheet.write(i, 5, r.text)
            new_worksheet.write(i, 6, "fail")
new_workbook.save('D:/Programs/Python/resource/result.xlsx')

python实现从excel读取数据进行批量get请求