Python3 MySQL CSV

本文介绍了使用Python通过Shell命令将本地CSV文件导入MySQL数据库的方法。经过多次尝试,最终确定了一种稳定有效的方式,并记录下了从失败到成功的调试过程。
今天遇到一个问题, 我需要在Python3里面去load本地的CSV 文件到MySQL中(5.1.63)
直接在shell里面写如下的命令是可以正常实现我要的效果的
load data local infile '/root/2012-08-10.csv' into table market fields terminated by ',' lines terminated by '\n';

由此想用Python去调用shell, 然后再利用shell去控制MySQL的local, 这样理论上应该是可行的.而且我看到过一个前辈写的perl的代码就是这么作的.但我一直在怀疑,这样不知道算不算旁门左道......如果有问题的话,这样写出来的代码应该是很难维护的..

最后够成功的达到目的了但是其中的周折记录在此

版本1:在MySQL命令行下输入

use test;

load data local infile '/root/2012-08-10.csv' into table market fields terminated by ',' lines terminated by '\n';

成功达到效果


版本2:在shell下输入

"use test;load data local infile '/root/2012-08-10.csv' IGNORE into table market FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'" | mysql -uroot -psmall`;

失败


版本3:在shell下输入

`echo "use test;load data local infile '/root/2012-08-10.csv' IGNORE into table market FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'" | mysql -uroot -psmall`;

成功


版本4:在Python中输入

cmd = """`echo "use test;load data local infile '/root/2012-08-10.csv' IGNORE into table market FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'" | mysql -uroot -psmall`;"""

os.system(cmd)

成功


其实在版本2到版本3的转变当中, 我遇到了很大的麻烦, 原因在于对shell不熟悉,对管道的概念不是很清楚, 竟然没有意识到管道需要左边部分的标准输出作为右边部分的标准输入而漏掉了echo. 恰好echo则是将字符串送入标准输出... 



### 处理Python3中从CSV导入到MySQL时遇到的空值问题 在实际开发过程中,当使用Python将包含空值的CSV文件插入到MySQL数据库时,可能会面临一些挑战。以下是解决这一问题的具体方法。 #### 解决方案概述 为了正确处理CSV文件中的空值并将数据插入到MySQL数据库中,可以采用以下策略: 1. **读取CSV文件**:利用`pandas`库来高效读取CSV文件,并能够灵活处理其中的空值。 2. **预处理数据**:对于CSV文件中的空值,可以选择将其替换为特定的占位符(如`None`或`NULL`),以便后续插入到MySQL数据库时能被正确识别。 3. **连接MySQL数据库**:通过`SQLAlchemy`或`PyMySQL`建立与MySQL数据库的连接。 4. **执行插入操作**:将经过预处理的数据逐条插入到目标表中。 --- #### 实现代码示例 ```python import pandas as pd import pymysql from sqlalchemy import create_engine # 读取CSV文件并加载为空值的地方填充为 None 或 NULL def read_csv(file_path): data = pd.read_csv(file_path, keep_default_na=True, na_values=['', ' ', 'NA']) # 自定义空值判断条件[^2] return data.fillna(value=None) # 建立 MySQL 数据库连接 def connect_to_mysql(host, port, user, password, db_name): connection_string = f"mysql+pymysql://{user}:{password}@{host}:{port}/{db_name}?charset=utf8" engine = create_engine(connection_string) # 使用 SQLAlchemy 创建引擎[^4] return engine # 插入数据到 MySQL 表 def insert_data_to_mysql(dataframe, table_name, engine): dataframe.to_sql(name=table_name, con=engine, if_exists='append', index=False) # 将 DataFrame 插入到 MySQL 表中[^3] if __name__ == "__main__": csv_file_path = "example.csv" # 替换为你的 CSV 文件路径 mysql_host = "localhost" mysql_port = 3306 mysql_user = "root" mysql_password = "your_password" # 替换为你的 MySQL 密码 mysql_db_name = "test_db" # 替换为目标数据库名称 target_table_name = "target_table" # 替换为目标表名 df = read_csv(csv_file_path) engine = connect_to_mysql(mysql_host, mysql_port, mysql_user, mysql_password, mysql_db_name) insert_data_to_mysql(df, target_table_name, engine) ``` --- #### 关键点解析 1. **空值处理** 在读取CSV文件时,可以通过参数`keep_default_na``na_values`来自定义哪些值应被视为缺失值。随后调用`fillna()`函数将这些缺失值设置为`None`或其他合适的替代值。 2. **数据库连接配置** `create_engine()`函数创建了一个基于SQLAlchemy的数据库连接对象,它支持更高级的功能,例如事务管理、ORM映射等。 3. **批量插入优化** 利用`to_sql()`方法可以直接将整个DataFrame一次性写入MySQL表中,从而显著提高性能。 4. **错误排查** 如果发现数据已成功插入但未显示在查询结果中,则需检查是否存在隐式的提交机制失效情况。可以在`connect_to_mysql()`部分显式启用自动提交模式[^5]。 --- #### 注意事项 - 确保安装必要的依赖项:`pip install pandas pymysql sqlalchemy` - 对于大规模数据集,建议分批次上传以减少内存占用。 - 若某些字段不允许存储`NULL`值,在设计数据库结构阶段就需要明确规定其约束条件。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值