python读取文本数据写入到数据库及查询优化

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 文本数据格式ip2int函数用于IP地址转化为整数int2ip函数用于整数转化为IP地址insert_row函数用于插入数据库记录from __future__ import print_functionimport torndbdef get_mysql_conn():    return torndb.Connection(        host=mysql[


文本数据格式

wKiom1Z4LlnTJ2BsAABumSdrKSw965.png

ip2int函数用于IP地址转化为整数

int2ip函数用于整数转化为IP地址

insert_row函数用于插入数据库记录



from __future__ import print_function
import torndb


def get_mysql_conn():
    return torndb.Connection(
        host=mysql["host"] + ":" + mysql["port"],
        database=mysql["database"],
        user=mysql["user"],
        password=mysql["password"],
        charset="utf8")


mysql = {
        "host": "127.0.0.1",
        "port": "3306",
        "database": "test",
        "password": "",
        "user": "root",
        "charset": "utf8"
    }


def ip2int(ip):
    try:
        hexn = ''.join(["%02X" % long(i) for i in ip.split('.')])
    except Exception, e:
        hexn = ''.join(["%02X" % long(i) for i in '0.0.0.0'.split('.')])
    return long(hexn, 16)


def int2ip(n):
    d = 256 * 256 * 256
    q = []
    while d > 0:
        m,n = divmod(n,d)
        q.append(str(m))
        d = d/256
    return '.'.join(q)


def insert_row():
    with open("./ipdata.csv", 'r') as fr:
        lines = fr.readlines()
    nl_p_list = []
    for l in lines:
        ls = l.strip().split(',', 4)
        c1, c2, c3, c4, c5 = ls[0], ip2int(ls[1]), ip2int(ls[2]), ls[3], ls[4]
        nl = [c2, c3, c4, c5]
        nl_p_list.append(nl)

    db = get_mysql_conn()
    db.execute("START TRANSACTION")
    for i in range(len(nl_p_list)/1000 + 1):
        tmp_nl_p_list = nl_p_list[i*1000: (i+1)*1000]
        ret = db.insertmany('insert into ipdata (startip, endip, country, carrier) values (%s, %s, %s, %s)', tmp_nl_p_list)
    db.execute("COMMIT")


if __name__ == '__main__':
    insert_row()
    # print(ip2int('106.39.222.36'))
    with open("./ipdata.csv", 'r') as fr:
        lines = fr.readlines()
    nl_p_list = []
    for l in lines:
        ls = l.strip().split(',', 4)
        c1, c2, c3, c4, c5 = ls[0], ip2int(ls[1]), ip2int(ls[2]), ls[3], ls[4]
        nl = [c2, c3, c4, c5]
        nl_p_list.append(nl)
    import random
    import time
    ip_list = map(lambda x: x[1], random.sample(nl_p_list, 100))
    db = get_mysql_conn()
    ret_list = []
    #{0}表名
    sql_tmp = 'select {0}.* from (SELECT * FROM `test`.ipdata where %s>=startip order by startip Desc limit 1) {0}'
    sql_list = []
    #拼接一个很长的sql
    for i in range(len(ip_list)):
        sql_list.append(sql_tmp.format('t' + str(i)) % ip_list[i])
    sql = ' union all '.join(sql_list)
    t0 = time.time()
    # for row in db.query(sql):
    #     print(row)
    dict(zip(ip_list, db.query(sql)))

    t1 = time.time()
    for ip in ip_list:
        ret = db.get('SELECT * FROM `test`.ipdata where %s>=startip order by startip Desc limit 1', ip)
        startip, endip = ret.get('startip'), ret.get('endip')
        if startip <= ip <= endip:
            ret_list.append((ip, ret.get('country')))
        else:
            ret_list.append((ip, u"unknown"))
    t2 = time.time()
    print(t1-t0)
    print(t2-t1)


格式化输出字符串函数format()

使用字符串的参数使用{NUM}进行表示,0, 表示第一个参数,1, 表示第二个参数, 以后顺次递加;

zip()函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表

dict()函数是从可迭代对象来创建新字典。比如一个元组组成的列表


参考文章:

Python标准库:内置函数dict

http://www.2cto.com/kf/201411/354739.html



优化的途径:

字段加索引效率提高1000倍

使用union all一次查询查出

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1727003

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
数据处理 Python
如何使用Python的Pandas库进行数据排序和排名
【4月更文挑战第22天】Pandas Python库提供数据排序和排名功能。使用`sort_values()`按列进行升序或降序排序,如`df.sort_values(by=&#39;A&#39;, ascending=False)`。`rank()`函数用于计算排名,如`df[&#39;A&#39;].rank(ascending=False)`。多列操作可传入列名列表,如`df.sort_values(by=[&#39;A&#39;, &#39;B&#39;], ascending=[True, False])`和分别对&#39;A&#39;、&#39;B&#39;列排名。
14 2
|
3天前
|
机器学习/深度学习 数据挖掘 网络架构
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
15 0
|
4天前
|
机器学习/深度学习 算法 数据挖掘
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享-2
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享
28 1
|
3天前
|
机器学习/深度学习 算法 算法框架/工具
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
24 0
|
1天前
|
机器学习/深度学习 存储 监控
数据分享|Python卷积神经网络CNN身份识别图像处理在疫情防控下口罩识别、人脸识别
数据分享|Python卷积神经网络CNN身份识别图像处理在疫情防控下口罩识别、人脸识别
|
1天前
|
机器学习/深度学习 数据采集 算法
Python信贷风控模型:Adaboost,XGBoost,SGD, SVC,随机森林, KNN预测信贷违约支付|数据分享
Python信贷风控模型:Adaboost,XGBoost,SGD, SVC,随机森林, KNN预测信贷违约支付|数据分享
Python信贷风控模型:Adaboost,XGBoost,SGD, SVC,随机森林, KNN预测信贷违约支付|数据分享
|
1天前
|
JSON 数据可视化 定位技术
python_将包含汉字的字典数据写入json(将datav的全省数据中的贵州区域数据取出来)
python_将包含汉字的字典数据写入json(将datav的全省数据中的贵州区域数据取出来)
5 0
|
1天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL与NoSQL的主要区别在于数据结构、查询语言和可扩展性。MySQL是关系型数据库,依赖预定义的数据表结构,使用SQL进行复杂查询,适合垂直扩展。而NoSQL提供灵活的存储方式(如JSON、哈希表),无统一查询语言,支持横向扩展,适用于处理大规模、非结构化数据和高并发场景。选择哪种取决于应用需求、数据模型及扩展策略。
10 0
|
2天前
|
SQL 关系型数据库 MySQL
第十三章 Python数据库编程
第十三章 Python数据库编程
|
2天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信