愛在花開的季節 发表于 2025-1-1 18:20:59

详解利用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"):
    item = line.split(",")
    print("姓名:", item)
    print("年龄:", item)
    print("性别:", item)
    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, columns=data_list)
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)))


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.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()
    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数据库中查询到所有结果。
https://i-blog.csdnimg.cn/direct/41950c264b8544a499ff29488f980fd2.png
从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
    source_cursor.execute(f"SELECT * FROM {table_name}")
    rows = source_cursor.fetchall()

    columns = 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()  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 详解利用python读写csv,以及将csv数据写入数据库