需求:读取excel得到位置,根据位置名称获取到百度地图的坐标,然后更新数据库信息。
读完此篇文章,能学到的知识:
1、 python操作数据库
2、requests请求url得到数据
3、xlrd读取excel文件
4、parse转码
5、hashlib加密计算sn
一、环境
python 3.9.2
pip 21.2.4
windows / linux
二、需要用到的包
所有包的安装方式均为:pip install xxx
pip install requests
pip install pymysql
pip install xlrd
三、代码操作
1. 代码结构目录:
2. 链接数据库:不需要多说 基础的host、user、password、database、port、charset替换成自己的就行了
import pymysql
class MysqlHelper:
# 定义初始化变量
def __init__(self, host="127.0.0.1", user="root", password="This1020", database="db_jinan_bill", port=3306, charset="utf8"):
self.host = host
self.port = port
self.database = database
self.user = user
self.password = password
self.charset = charset
# 链接数据库
def connect(self):
self.conn = pymysql.connect(host=self.host,
user=self.user,
password=self.password,
database=self.database,
port=self.port,
charset=self.charset)
self.cur = self.conn.cursor()
# 查询一条记录
def fetchOne(self, sql, params = None):
dataOne = None
try:
count = self.cur.execute(sql, params)
if count != 0:
dataOne = self.cur.fetchone()
except Exception as ex:
print(ex)
finally:
self.close()
return dataOne
# 查询多条记录
def fetchAll(self, sql, params = None):
dataAll = None
try:
count = self.cur.execute(sql, params)
if count != 0:
dataAll = self.cur.fetchall()
except Exception as ex:
print(ex)
finally:
self.close()
return dataAll
# 执行 增删改统一方法
def __item(self, sql, params = None):
count = 0
try:
count = self.cur.execute(sql, params)
self.conn.commit()
except Exception as ex:
print(ex)
return count
# 新增数据
def insert(self, sql, params = None):
return self.__item(sql, params)
# 修改数据
def update(self, sql, params = None):
return self.__item(sql, params)
# 删除数据
def delete(self, sql, params = None):
return self.__item(sql, params)
#关闭方法
def close(self):
if self.cur != None:
self.cur.close()
if self.conn != None:
self.cur.close()
3. 逻辑代码段
1)引用包
from urllib import parse # 转码
import hashlib # hash md5
from database.mysql import MysqlHelper # 操作数据库
import requests # 请求URL
import xlrd # 读取表格
2)组装url:把里面的ak和sk替换成自己的,用我的说不定哪会就用不了了。
# 组装url
def get_url(self, address = None):
# 已get请求为例:http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=你的ak
queryStr = '/geocoder/v2/?address=%s&output=json&ak=Y6F597W87rrsWrmuwUGgEFjy' % address
# 对queryStr进行转码,safe内保留字符不转换
encodeStr = parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
# 最后追加yoursk
rawStr = encodeStr + '7r58bdiCoh6PGpkoEQ544PljySwn9sMI'
# 计算sn
sn = (hashlib.md5(parse.quote_plus(rawStr).encode("utf8")).hexdigest())
# 由于URL里面还有中文,所以需要parse.quote进行处理,然后返回最终可调用的url
url = parse.quote("http://api.map.baidu.com"+queryStr+"&sn="+sn, safe="/:=&?#+!$,;'@()*[]")
return url
3)读取excel文件
# 读取excel表格 组装数组
def read_excel(self):
# 读取excel
data = xlrd.open_workbook(r'F:\python\coordinate\tests.xls')
table = data.sheets()[0]
# 组装tables
tables = []
for rown in range(table.nrows):
array = {'name': '', 'number': '', 'school': '', 'device': ''}
array['name'] = table.cell_value(rown, 0) # 第一列数据 位置名称
array['number'] = table.cell_value(rown, 1) # 第二列数据 设备序列号
array['school'] = table.cell_value(rown, 2) # 第二列数据 学校名称
array['device'] = table.cell_value(rown, 3) # 第二列数据 设备名称
tables.append(array)
return tables
4)链接数据库
# 链接数据库
def __init__(self):
self.helper = MysqlHelper()
self.helper.connect()
5)获取url返回信息,并根据条件入库
# 访问url获取返回信息
def go_url(self):
tables = self.read_excel() # 拿到表格数组
for index in range(len(tables)):
if index != 0: # 排除第一行
# get请求url获取返回数据
url = self.get_url(tables[index]['name'])
res = requests.get(url)
res.encoding = 'utf-8'
data = res.json()
# 请求成功进行组装修改数据库
if data['status'] == 0:
# 组装坐标
coordinate = str(data['result']['location']['lng']) + ',' + str(data['result']['location']['lat'])
number = tables[index]['number']
# 组装sql 并执行
sql = "update t_device set coordinate = %s where serial_number = %s and is_delete = %s"
params = [
coordinate,
number,
0
]
end = self.helper.update(sql, params)
if end == 1:
print(tables[index]['school'] + '的' + tables[index]['device'] + ' 更新成功')
else:
print(tables[index]['school'] + '的' + tables[index]['device'] + ' 更新失败或数据和数据库值重复,坐标为:' + coordinate)
else:
print(tables[index]['school'] + '的' + tables[index]['device'] + ' 坐标搜索不到')
self.helper.close() # 执行完毕关闭数据库连接
四、总结
完整git代码:GitHub - echo-xiaozhi/python-baidu-coordrinate: 读取excel获取位置名称,拿到百度api坐标,更新数据库
有哪里不太能理解的,可以留言或者私信问我,看到即回。