python读写csv并将csv数据写入数据库

 更新时间:2024年11月08日 09:20:33   作者:仙草哥哥  
CSV,也即Comma-Separated Values,是一种用于存储表格数据的纯文本文件格式,本文主要介绍了如何使用python读写csv并将csv数据写入数据库,感兴趣的可以了解下

csv文件

csv介绍

CSV,也即Comma-Separated Values,是一种用于存储表格数据的纯文本文件格式,其中每一行代表一条记录,记录中的各个字段由逗号分隔。

姓名,年龄,性别
张三,25,男
李四,28,男
王五,22,男
六六,29,女
子柒,28,女

 对于这样一个纯文本记录,打开以后可能显示就像这样:

姓名年龄性别
张三25
李四28
王五23
六六36
子柒34

切勿自行读写csv

很多人会想,既然csv文件不过就是逗号分隔的纯文本而已,那么,通过循环和split分隔不就好了吗?

csv_text = """姓名,年龄,性别
张三,25,男
李四,28,男
王五,22,男
六六,29,女
子柒,28,女"""
 
 
for line in csv_text.split("\n")[1::]:
    item = line.split(",")
    print("姓名:", item[0])
    print("年龄:", item[1])
    print("性别:", item[2])
    print()

这样做看起来行之有效,而且也非常简单,容易理解,但是,不要这样做。因为,在一些情况下,这样会引入错误。例如,当某个项中有逗号的时候,如一个人的名字叫做xu,kun,按照正确的csv文件格式,会写为"xu,kun",并且是符合要求的选项。但是如果使用简单的split分隔,这个名字也会被拆分开来,从而导致项变多,产生错误。

csv读写

读取csv

在python中存在内置的csv库,因此,使用内置的csv库:

import csv
 
with open("my_file.csv") as f:
    csv_reader = csv.reader(f, delimiter=",")
    for row in csv_reader:
        print(row)

写入csv

import csv
 
with open("my_file.csv", "w", newline="") as f:
    csv_writer = csv.writer(f, delimiter=",")
    csv_writer.writerow(['姓名', '年龄', '性别'])
    csv_writer.writerow(['张三', '25', '男'])
    csv_writer.writerow(['李四', '28', '男'])
    csv_writer.writerow(['王五', '22', '男'])
    csv_writer.writerow(['六六', '29', '女'])
    csv_writer.writerow(['子柒', '28', '女'])

pandas读写csv

读取csv

如果只是为了读写csv,那么直接使用内置的csv库即可。但是,如果为了让pandas使用csv,那么,可以通过pandas直接读写。

import pandas as pd
 
csv_data = pd.read_csv("my_file.csv")
print(csv_data)

写入csv

如果是DataFrame的类型,那么使用:

import pandas as pd
 
# 如果csv_data已经是DataFrame
csv_data.to_csv("my_file.csv", index=False)

如果是通过列表写入,那么使用:

import pandas as pd
 
data_list = [
    ['姓名', '年龄', '性别'],
    ['张三', '25', '男'],
    ['李四', '28', '男'],
    ['王五', '22', '男'],
    ['六六', '29', '女'],
    ['子柒', '28', '女']
]
 
csv_data = pd.DataFrame(data_list[1::], columns=data_list[0])
csv_data.to_csv("my_file.csv", index=False)

csv与数据库

从csv读取数据添加到mysql

添加数据本身并不困难,问题在于怎么样自动创建数据表。由于自动选择数据类型可能不能选择到最适合的类型,因此最好还是应该自行创建数据表,然后再进行数据的插入。

import pandas as pd
import pymysql
import os
import re
 
 
try:
    conn = pymysql.connect(
        host="数据库地址",
        user="用户名",
        password="密码",
        database="数据库名"
    )
    cursor = conn.cursor()
    print("数据库连接成功!")
except pymysql.MySQLError as e:
    print(f"数据库连接失败:{e}")
    raise
 
 
csv_file_path = "my_csv.csv"
df = pd.read_csv(csv_file_path)
df = df.where(pd.notnull(df), None)
 
 
table_name = re.sub(r'\W|^(?=\d)', '_', os.path.splitext(os.path.basename(csv_file_path))[0])
 
 
def create_table(cursor, table_name, df):
    columns = df.columns
    types = df.dtypes
    sql = f"CREATE TABLE IF NOT EXISTS `{table_name}` (id INT AUTO_INCREMENT PRIMARY KEY, "
    for col, dtype in zip(columns, types):
        if "int" in str(dtype):
            sql += f"`{col}` INT, "
        elif "float" in str(dtype):
            sql += f"`{col}` FLOAT, "
        elif "datetime" in str(dtype):
            sql += f"`{col}` DATETIME, "
        else:
            max_length = df[col].astype(str).map(len).max()
            sql += f"`{col}` VARCHAR({max_length}), "
    sql = sql.rstrip(", ") + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
    try:
        cursor.execute(sql)
        print(f"表 `{table_name}` 创建成功!")
    except pymysql.MySQLError as e:
        print(f"创建表时出错:{e}")
        cursor.close()
        conn.close()
        raise
 
create_table(cursor, table_name, df)
 
 
def insert_data(cursor, table_name, df):
    cols = "`,`".join([str(i) for i in df.columns.tolist()])
    placeholders = ','.join(['%s'] * len(df.columns))
    sql = f"INSERT INTO `{table_name}` (`{cols}`) VALUES ({placeholders})"
    data = df.values.tolist()
    try:
        cursor.executemany(sql, data)
        conn.commit()
        print(f"数据成功插入到表 `{table_name}` 中!")
    except pymysql.MySQLError as e:
        conn.rollback()
        print(f"插入数据时出错:{e}")
        cursor.close()
        conn.close()
        raise
 
insert_data(cursor, table_name, df)
 
 
cursor.close()
conn.close()

添加完成以后,即可在mysql数据库中查询到所有结果。

从mysql中读取数据写入csv

import pymysql
import csv
 
 
source_conn = pymysql.connect(
    host="源数据库地址",
    user="用户名",
    password="密码",
    database="源数据库名"
)
source_cursor = source_conn.cursor()
 
source_cursor.execute("SHOW TABLES")
tables = source_cursor.fetchall()
 
for table in tables:
    table_name = table[0]
    source_cursor.execute(f"SELECT * FROM {table_name}")
    rows = source_cursor.fetchall()
 
    columns = [desc[0] for desc in source_cursor.description]
 
    with open(f"{table_name}.csv", "w", newline="", encoding="utf-8") as file:
        writer = csv.writer(file)
        writer.writerow(columns)
        writer.writerows(rows) 
 
source_cursor.close()
source_conn.close()

到此这篇关于python读写csv并将csv数据写入数据库的文章就介绍到这了,更多相关python读写csv内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python将GIF动图转换为Base64编码字符串的步骤详解

    Python将GIF动图转换为Base64编码字符串的步骤详解

    在Web开发中,有时需要将图像文件(如GIF动图)转换为Base64编码的字符串,以便在HTML或CSS中直接嵌入图像数据,本文给大家就介绍了一个简单的教程,教你如何使用Python将GIF动图转换为Base64编码的字符串,需要的朋友可以参考下
    2025-02-02
  • Python之web模板应用

    Python之web模板应用

    这篇文章主要介绍了Python之web模板应用,web模板可以更加灵活和方便的控制HTML的显示,非常具有实用价值,有需要的小伙伴可以参考下
    2017-12-12
  • 利用python/R语言绘制圣诞树实例代码

    利用python/R语言绘制圣诞树实例代码

    圣诞节快到了,分别用R和Python绘制了圣诞树祝你们圣诞节快乐,所以下面这篇文章主要给大家介绍了关于如何利用python/R绘制圣诞树的相关资料,需要的朋友可以参考下
    2021-12-12
  • Python 安装教程以及快速入门

    Python 安装教程以及快速入门

    Python是一种简单易学的编程语言,适合初学者入门。本文将介绍Python的安装教程以及快速入门,帮助读者快速上手Python编程。
    2023-09-09
  • Python实现检测SSL证书是否过期

    Python实现检测SSL证书是否过期

    我们知道 SSL 证书是会过期的,一旦过期之后需要重新申请,如果没有及时更换证书的话,就有可能导致网站出问题,所以本文介绍了如何利用Python实现检测SSL证书是否过期,需要的可以参考下
    2023-08-08
  • Python OpenCV使用dlib进行多目标跟踪详解

    Python OpenCV使用dlib进行多目标跟踪详解

    这篇文章主要为大家介绍了如何使用 dlib 库在实时视频中有效地跟踪多个对象,文中的示例代码讲解详细,对我们学习OpenCV有一定帮助,需要的可以参考一下
    2022-03-03
  • 浅谈Python NLP入门教程

    浅谈Python NLP入门教程

    本篇文章主要介绍了Python NLP入门教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Flask 上传自定义头像的实例详解

    Flask 上传自定义头像的实例详解

    今天小编就为大家分享一篇Flask 上传自定义头像的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python实现提取COCO,VOC数据集中特定的类

    python实现提取COCO,VOC数据集中特定的类

    这篇文章主要介绍了python实现提取COCO,VOC数据集中特定的类,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python使用进程池并发执行SQL语句的操作代码

    Python使用进程池并发执行SQL语句的操作代码

    Python的进程池是一种并发工具,它允许我们将任务分发给一组工作进程,这些进程可以同时运行并共享一个进程池,本文给大家介绍了Python使用进程池并发执行SQL语句的操作代码,需要的朋友可以参考下
    2024-10-10

最新评论