python:大文件分批/块导入数据库方式记录

一、问题背景

对于数据文件比较大的数据,一次性串联sql进行入库,往往会受到数据库本身对sql长度的限制,从而需要分块或者分批次,将大数据文件一点一点的进行入库。特针对这种入库方式,进行一个简单记录,各类数据库入库后续均可参考下述实现分块的方式,进行分批入库数据。

二、实现记录

问题点其实主要是如何对数据进行分块。pyhton的read_csv函数和read_excel等数据读取函数都含有分批读取数据的参数:chunksize,从而实现分批入库。

如果是已经全部读取了数据,还想再进一步分批,则可以参考下述代码进行分批读取:

batch_size = 2000
total_rows = p_result_notice_mes_df.shape[0]    
total_batches = total_rows // batch_size + (1 if total_rows % batch_size > 0 else 0)
for i in range(total_batches):
        start_index = i * batch_size
        end_index = min((i + 1) * batch_size, total_rows)
        batch_df = p_result_notice_mes_df.iloc[start_index:end_index]

部分示例程序如下:

third_tbname ='bods.scw_info'
    # 计算数据总数和批次数
    batch_size = 2000
    total_rows = p_result_notice_mes_df.shape[0]    
    total_batches = total_rows // batch_size + (1 if total_rows % batch_size > 0 else 0)
    if p_third_flag:
        for i in range(total_batches):
            start_index = i * batch_size
            end_index = min((i + 1) * batch_size, total_rows)
            batch_df = p_result_notice_mes_df.iloc[start_index:end_index]
       
            third_values_list = []
            cursor.execute(f"truncate table {third_tbname} ")
            # 构建批量插入的SQL语句        
            insert_query = f"""
                        INSERT into {third_tbname} (changelog_id, notice_model, notice_batch,
                                                    brand, vehicle_type, rated_quality, total_quality, 
                                                    curb_weight, fuel_type, emission_standard)        
                            VALUES 
                            """
            for index, row in batch_df.iterrows():
                third_values_list.append(f"""('{row["变记录"]}' , '{row["告"]}', '{row["公次"]}', 
                                         '{row["品牌"]}', '{row["类型"]}', '{row["额量"]}', '{row["总"]}',
                                         '{row["整量"]}', '{row["燃类"]}', '{row["排放准"]}'
                                         )""")
            
            insert_query += ',\n'.join(third_values_list)
                        
            # 执行批量插入
            cursor.execute(insert_query) 
        print('公告url信息更新入库成功!\n')  
    else:
        print('公告链接信息无需更新') 
   
### 如何使用 Python 读取 CSV 文件的数据 在 Python 中,可以借助 `pandas` 库来高效地处理 CSV 数据。以下是基于提供的引用以及专业知识整理的一个完整的代码示例。 #### 使用 Pandas 读取整个 CSV 文件并转换为浮点数数组 如果目标是从 CSV 文件中读取所有数据并将它们存储在一个二维浮点型 NumPy 数组中,则可以通过以下方式实现: ```python import pandas as pd import numpy as np # 假设 'data.csv' 是要读取的文件名 df = pd.read_csv('data.csv') # 将 CSV 文件加载到 DataFrame 中[^1] # 转换为 NumPy 的 float 类型数组 float_array = df.to_numpy(dtype=np.float64) print(float_array) ``` 此代码片段通过调用 `pd.read_csv()` 方法将 CSV 文件中的内容加载至一个名为 `DataFrame` 的对象中,并进一步将其转化为 NumPy 浮点数组以便后续计算操作。 --- #### 只读取指定列(例如第一列) 当只需要提取某些特定列时,可以直接指定这些列的名字或索引来完成任务。下面展示了一个例子,它仅获取 CSV 文件的第一列数据: ```python import pandas as pd # 加载 CSV 文件 df = pd.read_csv('data.csv') # 提取第一列 (假设该列为数值类型) first_column_data = df.iloc[:, 0].values.astype(float) # iloc用于按位置选取列[^2] print(first_column_data) ``` 这里采用了 `.iloc[]` 来定位具体的列号;注意这里的索引从零开始计数。最后一步强制把选出来的 Series 对象转成纯量形式的 ndarray 并设定其元素类别为浮点数。 --- #### 防止多余空格和空白行干扰 为了确保导入过程中不会因为原始文档存在额外空间字符或者无意义的新行而引发潜在问题,在打开文件之前应该先清理这些问题区域。这可通过调整函数参数达成目的: ```python import pandas as pd # 设置 skipinitialspace=True 和 na_filter=False 参数以忽略开头可能存在的任何空白及缺失值标记 cleaned_df = pd.read_csv('data.csv', skipinitialspace=True, na_filter=False)[^3] print(cleaned_df.head()) # 查看前几条记录确认清洗效果 ``` 上述设置能够有效减少因格式不一致带来的麻烦,从而提高程序运行稳定性。 --- #### 更高效的 CSV 处理方法 对于非常庞大的数据集来说,性能优化变得尤为重要。此时推荐采用分读入的方式逐步解析大尺寸文件的一部分而不是一次性全部装载进内存里头去: ```python import pandas as pd chunk_size = 50000 # 定义每次迭代的最大行数量 chunks_iterator = pd.read_csv('large_dataset.csv', chunksize=chunk_size)[^4] for chunk in chunks_iterator: process(chunk) # 自定义业务逻辑替换此处占位符process() ``` 这种方法允许逐片分析超大规模资料库而不至于耗尽系统资源。 --- ### 总结 以上介绍了几种常见的利用 Python 解析 CSV 文档的技术手段及其应用场景下的注意事项。无论是简单的小规模项目还是复杂的大批量作业需求都能找到合适的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步,慕至千里

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值