利用MySqlBulkLoader实现批量插入数据的示例详解

目录
  • 介绍
  • 1.将List转化为DataTable
  • 2.将DataTable转换为标准的CSV文件
  • 3.CSV文件导入数据到数据库
  • 4.使用MySqlBulkLoader批量插入数据
  • 5.完整的代码

介绍

最近在项目中遇到插入数据瓶颈,几万、几十万、几百万的数据保存到MYSQL数据库,使用EF插入数据速度非常慢,数据量非常大时EF插入需要几十分钟,甚至几个小时,这样子的速度肯定不是我们所期望的。

后面经过了解与研究发现MySqlBulkLoader,可以批量将数据插入到数据库并且速度上面远远优于EF。

MySqlBulkLoader主要的实现方式:将需要插入的数据转成DataTable,DataTable转成一个CSV文件,将CSV文件使用批量导入的形式导入到数据库里面去。

注意:

1).数据库连接地址需要添加配置AllowLoadLocalInfile=true,允许本地文件导入;

Data Source = 数据库地址; Port = 端口; Initial Catalog = 数据库名; User Id = 用户名; Password = 密码;AllowLoadLocalInfile=true;

2).插入的时候会返回插入行数,但是检查所有的数据都正确,也没有报异常,却返回了插入数量为0,可以检查表是否有唯一索引,插入的数据是否违反了唯一索引

(以下分块展示了代码,如果需要看完整的代码直接看 5.完整的代码

1.将List转化为DataTable

/// <summary>
        /// 将List转化为DataTable
        /// </summary>
        /// <returns></returns>
        public DataTable ListToDataTable<T>(List<T> data)
        {
            #region 创建一个DataTable,以实体名称作为DataTable名称

            var tableName = typeof(T).Name;
            tableName = tableName.ToSnakeCase(); /*实体名称与表名进行转化,主要根据各项目的规定进行转化,不一定就是我这些写的这种转换方式*/
            DataTable dt = new DataTable
            {
                TableName = tableName
            };

            #endregion

            #region 拿取列名,以实体的属性名作为列名       

            var properties = typeof(T).GetProperties();
            foreach (var item in properties)
            {
                var curFileName = item.Name;
                curFileName = curFileName.ToSnakeCase();/*列名与字段名进行转化,主要根据各项目的规定进行转化,不一定就是我这些写的这种转换方式*/
                dt.Columns.Add(curFileName);
            }

            #endregion

            #region 列赋值
            foreach (var item in data)
            {
                DataRow dr = dt.NewRow();
                var columns = dt.Columns;

                var curPropertyList = item.GetType().GetProperties();
                foreach (var p in curPropertyList)
                {
                    var name = p.Name;
                    name = name.ToSnakeCase();/*列名与字段名进行转化,主要根据各项目的规定进行转化,不一定就是我这些写的这种转换方式*/
                    var curValue = p.GetValue(item);

                    int i = columns.IndexOf(name);
                    dr[i] = curValue;
                }

                dt.Rows.Add(dr);
            }

            #endregion  

            return dt;
        }

2.将DataTable转换为标准的CSV文件

/// <summary>
    /// csv扩展
    /// </summary>
    public static class CSVEx
    {
        /// <summary>
        ///将DataTable转换为标准的CSV文件
        /// </summary>
        /// <param name="table">数据表</param>
        /// <param name="tmpPath">文件地址</param>
        /// <returns>返回标准的CSV</returns>
        public static void ToCsv(this DataTable table, string tmpPath)
        {
            //以半角逗号(即,)作分隔符,列为空也要表达其存在。
            //列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。
            //列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。
            StringBuilder sb = new StringBuilder();
            DataColumn colum;
            foreach (DataRow row in table.Rows)
            {
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    Type _datatype = typeof(DateTime);
                    colum = table.Columns[i];
                    if (i != 0) sb.Append("\t");
                    //if (colum.DataType == typeof(string) && row[colum].ToString().Contains(","))
                    //{
                    //    sb.Append("\"" + row[colum].ToString().Replace("\"", "\"\"") + "\"");
                    //}
                    if (colum.DataType == _datatype)
                    {
                        sb.Append(((DateTime)row[colum]).ToString("yyyy/MM/dd HH:mm:ss"));
                    }
                    else sb.Append(row[colum].ToString());
                }
                sb.Append("\r\n");
            }
            StreamWriter sw = new StreamWriter(tmpPath, false, UTF8Encoding.UTF8);
            sw.Write(sb.ToString());
            sw.Close();
        }

    }

3.CSV文件导入数据到数据库

/// <summary>
    /// 批量导入mysql帮助类
    /// </summary>
    public static class MySqlHelper
    {
        /// <summary>
        /// MySqlBulkLoader批量导入
        /// </summary>
        /// <param name="_mySqlConnection">数据库连接地址</param>
        /// <param name="table"></param>
        /// <param name="csvName"></param>
        /// <returns></returns>
        public static int BulkLoad(MySqlConnection _mySqlConnection, DataTable table, string csvName)
        {
            var columns = table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList();
            MySqlBulkLoader bulk = new MySqlBulkLoader(_mySqlConnection)
            {
                FieldTerminator = "\t",
                FieldQuotationCharacter = '"',
                EscapeCharacter = '"',
                LineTerminator = "\r\n",
                FileName = csvName,
                NumberOfLinesToSkip = 0,
                TableName = table.TableName,

            };

            bulk.Columns.AddRange(columns);
            return bulk.Load();
        }
    }

4.使用MySqlBulkLoader批量插入数据

/// <summary>
        /// 使用MySqlBulkLoader批量插入数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="data"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public int BulkLoaderData<T>(List<T> data)
        {
            if (data.Count <= 0) return 0;

            var connectString = "数据库连接地址";
            using (MySqlConnection connection = new MySqlConnection(connectString))
            {
                MySqlTransaction sqlTransaction = null;
                try
                {
                    if (connection.State == ConnectionState.Closed)
                    {
                        connection.Open();
                    }
                    sqlTransaction = connection.BeginTransaction();

                    var dt = ListToDataTable<T>(data); //将List转成dataTable
                    string tmpPath = Path.GetTempFileName();
                    dt.ToCsv(tmpPath); //将DataTable转成CSV文件
                    var insertCount = MySqlHelper.BulkLoad(connection, dt, tmpPath); //使用MySqlBulkLoader插入数据
                    sqlTransaction.Commit();

                    try
                    {
                        if (File.Exists(tmpPath)) File.Delete(tmpPath);
                    }
                    catch (Exception)
                    {
                        //删除文件失败

                    }
                    return insertCount; //返回执行成功的条数
                }
                catch (Exception e)
                {
                    if (sqlTransaction != null)
                    {
                        sqlTransaction.Rollback();
                    }
                    //执行异常
                    throw e;
                }
            }

        }

5.完整的代码

namespace WebApplication1.BrantchInsert
{

    /// <summary>
    /// 批量插入
    /// </summary>
    public class BulkLoader
    {

        /// <summary>
        /// 测试批量插入入口
        /// </summary>
        /// <returns></returns>
        public int BrantchDataTest()
        {

            #region 模拟数据
            var data = new List<CrmCouponTestDto>() {
                 new CrmCouponTestDto {
                     Id=1,
                     CouponCode="test001",
                     CouponId = 1,
                     MemberId=100,
                     IssueTime=Convert.ToDateTime("2022-06-27 14:00:00"),
                     UsageTime=Convert.ToDateTime("3000-12-31 00:00:00"),
                     UsageShopId=0,
                     UsageBillNo="",
                     EffectiveStart=Convert.ToDateTime("2022-06-27 14:00:00"),
                     EffectiveEnd=Convert.ToDateTime("2023-06-27 14:00:00"),
                     Status=0
                 },
                 new CrmCouponTestDto {
                     Id=2,
                     CouponCode="test002",
                     CouponId = 1,
                       MemberId=101,
                     IssueTime=Convert.ToDateTime("2022-06-27 14:00:00"),
                     UsageTime=Convert.ToDateTime("2022-06-27 14:30:00"),
                     UsageShopId=2,
                     UsageBillNo="CS202206271430001",
                     EffectiveStart=Convert.ToDateTime("2022-06-27 14:00:00"),
                     EffectiveEnd=Convert.ToDateTime("2023-06-27 14:00:00"),
                     Status=1
                 },
                  new CrmCouponTestDto {
                     Id=3,
                     CouponCode="test003",
                     CouponId = 1,
                     MemberId=102,
                     IssueTime=Convert.ToDateTime("2022-06-27 14:00:00"),
                     UsageTime=Convert.ToDateTime("3000-12-31 00:00:00"),
                     UsageShopId=0,
                     UsageBillNo="",
                     EffectiveStart=Convert.ToDateTime("2022-06-27 14:00:00"),
                     EffectiveEnd=Convert.ToDateTime("2023-06-27 14:00:00"),
                     Status=0
                 },
                    new CrmCouponTestDto {
                     Id=4,
                     CouponCode="test004",
                     CouponId = 1,
                     MemberId=103,
                     IssueTime=Convert.ToDateTime("2022-06-27 14:00:00"),
                     UsageTime=Convert.ToDateTime("3000-12-31 00:00:00"),
                     UsageShopId=0,
                     UsageBillNo="",
                     EffectiveStart=Convert.ToDateTime("2022-06-27 14:00:00"),
                     EffectiveEnd=Convert.ToDateTime("2023-06-27 14:00:00"),
                     Status=0
                 }
             };
            #endregion
            var result = BulkLoaderData<CrmCouponTestDto>(data);
            return result;

        }

        /// <summary>
        /// 使用MySqlBulkLoader批量插入数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="data"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public int BulkLoaderData<T>(List<T> data)
        {
            if (data.Count <= 0) return 0;

            var connectString = "数据库连接地址";
            using (MySqlConnection connection = new MySqlConnection(connectString))
            {
                MySqlTransaction sqlTransaction = null;
                try
                {
                    if (connection.State == ConnectionState.Closed)
                    {
                        connection.Open();
                    }
                    sqlTransaction = connection.BeginTransaction();

                    var dt = ListToDataTable<T>(data); //将List转成dataTable
                    string tmpPath = Path.GetTempFileName();
                    dt.ToCsv(tmpPath); //将DataTable转成CSV文件
                    var insertCount = MySqlHelper.BulkLoad(connection, dt, tmpPath); //使用MySqlBulkLoader插入数据
                    sqlTransaction.Commit();

                    try
                    {
                        if (File.Exists(tmpPath)) File.Delete(tmpPath);
                    }
                    catch (Exception)
                    {
                        //删除文件失败

                    }
                    return insertCount; //返回执行成功的条数
                }
                catch (Exception e)
                {
                    if (sqlTransaction != null)
                    {
                        sqlTransaction.Rollback();
                    }
                    //执行异常
                    throw e;
                }
            }

        }

        /// <summary>
        /// 将List转化为DataTable核心方法
        /// </summary>
        /// <returns></returns>
        public DataTable ListToDataTable<T>(List<T> data)
        {
            #region 创建一个DataTable,以实体名称作为DataTable名称

            var tableName = typeof(T).Name;
            tableName = tableName.ToSnakeCase(); /*实体名称与表名进行转化,主要根据各项目的规定进行转化,不一定就是我这些写的这种转换方式*/
            DataTable dt = new DataTable
            {
                TableName = tableName
            };

            #endregion

            #region 拿取列名,以实体的属性名作为列名       

            var properties = typeof(T).GetProperties();
            foreach (var item in properties)
            {
                var curFileName = item.Name;
                curFileName = curFileName.ToSnakeCase();/*列名与字段名进行转化,主要根据各项目的规定进行转化,不一定就是我这些写的这种转换方式*/
                dt.Columns.Add(curFileName);
            }

            #endregion

            #region 列赋值
            foreach (var item in data)
            {
                DataRow dr = dt.NewRow();
                var columns = dt.Columns;

                var curPropertyList = item.GetType().GetProperties();
                foreach (var p in curPropertyList)
                {
                    var name = p.Name;
                    name = name.ToSnakeCase();/*列名与字段名进行转化,主要根据各项目的规定进行转化,不一定就是我这些写的这种转换方式*/
                    var curValue = p.GetValue(item);

                    int i = columns.IndexOf(name);
                    dr[i] = curValue;
                }

                dt.Rows.Add(dr);
            }

            #endregion  

            return dt;
        }

    }

    /// <summary>
    /// 批量导入mysql帮助类
    /// </summary>
    public static class MySqlHelper
    {
        /// <summary>
        /// MySqlBulkLoader批量导入
        /// </summary>
        /// <param name="_mySqlConnection">数据库连接地址</param>
        /// <param name="table"></param>
        /// <param name="csvName"></param>
        /// <returns></returns>
        public static int BulkLoad(MySqlConnection _mySqlConnection, DataTable table, string csvName)
        {
            var columns = table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList();
            MySqlBulkLoader bulk = new MySqlBulkLoader(_mySqlConnection)
            {
                FieldTerminator = "\t",
                FieldQuotationCharacter = '"',
                EscapeCharacter = '"',
                LineTerminator = "\r\n",
                FileName = csvName,
                NumberOfLinesToSkip = 0,
                TableName = table.TableName,

            };

            bulk.Columns.AddRange(columns);
            return bulk.Load();
        }
    }

    /// <summary>
    /// csv扩展
    /// </summary>
    public static class CSVEx
    {
        /// <summary>
        ///将DataTable转换为标准的CSV文件
        /// </summary>
        /// <param name="table">数据表</param>
        /// <param name="tmpPath">文件地址</param>
        /// <returns>返回标准的CSV</returns>
        public static void ToCsv(this DataTable table, string tmpPath)
        {
            //以半角逗号(即,)作分隔符,列为空也要表达其存在。
            //列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。
            //列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。
            StringBuilder sb = new StringBuilder();
            DataColumn colum;
            foreach (DataRow row in table.Rows)
            {
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    Type _datatype = typeof(DateTime);
                    colum = table.Columns[i];
                    if (i != 0) sb.Append("\t");
                    //if (colum.DataType == typeof(string) && row[colum].ToString().Contains(","))
                    //{
                    //    sb.Append("\"" + row[colum].ToString().Replace("\"", "\"\"") + "\"");
                    //}
                    if (colum.DataType == _datatype)
                    {
                        sb.Append(((DateTime)row[colum]).ToString("yyyy/MM/dd HH:mm:ss"));
                    }
                    else sb.Append(row[colum].ToString());
                }
                sb.Append("\r\n");
            }
            StreamWriter sw = new StreamWriter(tmpPath, false, UTF8Encoding.UTF8);
            sw.Write(sb.ToString());
            sw.Close();
        }

    }

    /// <summary>
    /// 字符串转化
    /// </summary>
    public static class StringExtensions
    {
        /// <summary>
        /// 转换为 main_keys_id 这种形式的字符串方式
        /// </summary>
        public static string ToSnakeCase(this string input)
        {
            if (string.IsNullOrEmpty(input)) { return input; }

            var startUnderscores = Regex.Match(input, @"^_+");
            return startUnderscores + Regex.Replace(input, @"([a-z0-9])([A-Z])", "$1_$2").ToLower();
        }
    }

    /// <summary>
    /// 实体
    /// </summary>
    public class CrmCouponTestDto
    {
        /// <summary>
        /// ID
        /// </summary>
        public long Id { get; set; }

        /// <summary>
        /// 卡券号
        /// </summary>
        public string CouponCode { get; set; }

        /// <summary>
        /// 卡券ID
        /// </summary>
        public int CouponId { get; set; }

        /// <summary>
        /// 会员ID
        /// </summary>
        public int MemberId { get; set; }

        /// <summary>
        /// 发放时间
        /// </summary>
        public DateTime IssueTime { get; set; }

        /// <summary>
        /// 使用时间
        /// </summary>
        public DateTime UsageTime { get; set; }

        /// <summary>
        /// 使用店铺ID
        /// </summary>      

        public int UsageShopId { get; set; }

        /// <summary>
        /// 使用单号
        /// </summary>
        public string UsageBillNo { get; set; }

        /// <summary>
        /// 有效开始时间
        /// </summary>
        public DateTime EffectiveStart { get; set; }

        /// <summary>
        /// 有效结束时间
        /// </summary>
        public DateTime EffectiveEnd { get; set; }

        /// <summary>
        /// 状态
        /// CouponStatus 卡券状态:
        /// -1:未领用
        /// 0:未使用
        /// 1:已使用
        /// 2:已过期
        ///3:已作废
        ///4:转赠中
        /// </summary>

        public Int16 Status { get; set; }
    }
}

以上就是利用MySqlBulkLoader实现批量插入数据的示例详解的详细内容,更多关于MySqlBulkLoader批量插入数据的资料请关注我们其它相关文章!

(0)

相关推荐

  • MySql批量插入时如何不重复插入数据

    目录 前言 一.insert ignore into 二.on duplicate key update 三.replace into 总结 前言 Mysql插入不重复的数据,当大数据量的数据需要插入值时,要判断插入是否重复,然后再插入,那么如何提高效率?解决的办法有很多种,不同的场景解决方案也不一样,数据量很小的情况下,怎么搞都行,但是数据量很大的时候,这就不是一个简单的问题了. 一.insert ignore into 会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果

  • MYSQL批量插入数据的实现代码第1/3页

    @echo off cls set CLASSPATH=..\api\jogre.jar set CLASSPATH=%CLASSPATH%;. set CLASSPATH=%CLASSPATH%;classes set CLASSPATH=%CLASSPATH%;lib\dom4j.jar java org.jogre.server.JogreServer 建表 复制代码 代码如下: create database con_test; use con_test; create table te

  • MySQL批量插入数据脚本

    MySQL批量插入数据脚本 #!/bin/bash i=1; MAX_INSERT_ROW_COUNT=$1; while [ $i -le $MAX_INSERT_ROW_COUNT ] do mysql -uroot -proot dbname -e "insert into tablename (name,age,createTime) values ('HELLO$i',$i % 99,NOW());" d=$(date +%M-%d\ %H\:%m\:%S) echo &qu

  • MySQL通过函数存储过程批量插入数据

    目录 数据库 mysql批量插入数据函数存储过程 附:MySQL通过函数批量插入数据 总结 数据库 mysql批量插入数据函数存储过程 -- 1 批量插入数据 -- 1.1 创建表 CREATE TABLE `dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAULT NULL, `address` VARCHAR(40) DEFAULT NULL, ceo INT NULL , PRIMARY KEY

  • mysql大批量插入数据的4种方法示例

    前言 本文主要给大家介绍了关于mysql大批量插入数据的4种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法一:循环插入 这个也是最普通的方式,如果数据量不是很大,可以使用,但是每次都要消耗连接数据库的资源. 大致思维如下 (我这里写伪代码,具体编写可以结合自己的业务逻辑或者框架语法编写) for($i=1;$i<=100;$i++){ $sql = 'insert...............'; //querysql } foreach($arr as $key =

  • 利用MySqlBulkLoader实现批量插入数据的示例详解

    目录 介绍 1.将List转化为DataTable 2.将DataTable转换为标准的CSV文件 3.CSV文件导入数据到数据库 4.使用MySqlBulkLoader批量插入数据 5.完整的代码 介绍 最近在项目中遇到插入数据瓶颈,几万.几十万.几百万的数据保存到MYSQL数据库,使用EF插入数据速度非常慢,数据量非常大时EF插入需要几十分钟,甚至几个小时,这样子的速度肯定不是我们所期望的. 后面经过了解与研究发现MySqlBulkLoader,可以批量将数据插入到数据库并且速度上面远远优于

  • MySQL实现数据插入操作的示例详解

    目录 一.方法分类 二.具体方法 三.实例 (1)常规插入 (2)从另一个表导入 (3)插入时数据重复 四.注意事项 (1)不写字段名,需要填充自增ID (2)按字段名填充,可以不录入id 其余注意事项 使用MySQL插入数据时,可以根据需求场景选择合适的插入语句,例如当数据重复时如何插入数据,如何从另一个表导入数据,如何批量插入数据等场景.本文通过给出每个使用场景下的实例来说明数据插入的实现过程和方法. 一.方法分类 二.具体方法 使用场景 作用 语句 注意 常规插入 忽略字段名 insert

  • Python实现批量采集商品数据的示例详解

    目录 本次目的 知识点 开发环境 代码 本次目的 python批量采集某商品数据 知识点 requests 发送请求 re 解析网页数据 json 类型数据提取 csv 表格数据保存 开发环境 python 3.8 pycharm requests 代码 导入模块 import json import random import time import csv import requests import re import pymysql 核心代码 # 连接数据库 def save_sql(t

  • mysql 循环批量插入的实例代码详解

    背景 前几天在MySql上做分页时,看到有博文说使用 limit 0,10 方式分页会有丢数据问题,有人又说不会,于是想自己测试一下.测试时没有数据,便安装了一个MySql,建了张表,在建了个while循环批量插入10W条测试数据的时候,执行时间之长无法忍受,便查资料找批量插入优化方法,这里做个笔记. 数据结构 寻思着分页时标准列分主键列.索引列.普通列3种场景,所以,测试表需要包含这3种场景,建表语法如下: drop table if exists `test`.`t_model`; Crea

  • 利用Hadoop实现求共同好友的示例详解

    目录 前言 业务分析 实现思路分析 编码实现 1.第一个map类 2.第一个Reduce类 3.第一个Job类 4.第二个map类 5.第二个Reducer类 6.第二个Job类 前言 在很多社交APP中,比如大家熟悉的QQ好友列表中,打开会话框,经常可以看到下面有一栏共同好友的推荐列表,用户通过这种方式,可以添加潜在的关联好友 这种功能该如何实现呢?对redis比较了解的同学应该能很快想到,可以使用redis来实现这个功能.没错,redis确实是个不错的可以实现这个功能的方案. 但redis的

  • Oracle 数据仓库ETL技术之多表插入语句的示例详解

    目录 创建示例表 无条件的 INSERT ALL 语句 有条件的 INSERT ALL 语句 有条件的 INSERT FIRST 语句 多表插入语句的限制 大家好!我是只谈技术不剪发的 Tony 老师. ETL(提取.转换.加载)是指从源系统中提取数据并将其放入数据仓库的过程.Oracle 数据库为 ETL 流程提供了丰富的功能,今天我们就给大家介绍一下 Oracle 多表插入语句,也就是INSERT ALL语句. 创建示例表 我们首先创建一个源数据表和三个目标表: CREATE TABLE s

  • Mysql联表update数据的示例详解

    1.MySQL UPDATE JOIN语法 在MySQL中,可以在 UPDATE语句 中使用JOIN子句执行跨表更新.MySQL UPDATE JOIN的语法如下: UPDATE T1, T2, [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1 SET T1.C2 = T2.C2, T2.C3 = expr WHERE condition 更详细地看看MySQL UPDATE JOIN语法: 首先,在UPDATE子句之后,指定主表(T1)和希望主表连接表

  • TensorFlow人工智能学习创建数据实现示例详解

    目录 一.数据创建 1.tf.constant() 2.tf.convert_to_tensor() 3.tf.zeros() 4.tf.fill() 二.数据随机初始化 ①tf.random.normal() ②tf.random.truncated_normal() ③tf.random.uniform() ④tf.random.shuffle() 一.数据创建 1.tf.constant() 创建自定义类型,自定义形状的数据,但不能创建类似于下面In [59]这样的,无法解释的数据. 2.

  • 详解Python中生成随机数据的示例详解

    目录 随机性有多随机 加密安全性 PRNG random 模块 数组 numpy.random 相关数据的生成 random模块与NumPy对照表 CSPRNG 尽可能随机 os.urandom() secrets 最佳保存方式 UUID 工程随机性的比较 在日常工作编程中存在着各种随机事件,同样在编程中生成随机数字的时候也是一样,随机有多随机呢?在涉及信息安全的情况下,它是最重要的问题之一.每当在 Python 中生成随机数据.字符串或数字时,最好至少大致了解这些数据是如何生成的. 用于在 P

  • Pandas读存JSON数据操作示例详解

    目录 引言 读取json数据 模拟数据 参数orident orident="split" orient="records" orient="index" orient="columns" orient="values" to_json 引言 本文介绍的如何使用Pandas来读取各种json格式的数据,以及对json数据的保存 读取json数据 使用的是pd.read_json函数,见官网:pandas.p

随机推荐