详解利用python读写csv,以及将csv数据写入数据库

打印 上一主题 下一主题

主题 879|帖子 879|积分 2637

csv文件

csv介绍

CSV,也即Comma-Separated Values,是一种用于存储表格数据的纯文本文件格式,其中每一行代表一条记载,记载中的各个字段由逗号分隔。
   姓名,年岁,性别
张三,25,男
李四,28,男
王五,22,男
六六,29,女
子柒,28,女
   对于如许一个纯文本记载,打开以后可能表现就像如许:
姓名年岁性别
张三25
李四28
王五23
六六36
子柒34
切勿自行读写csv

很多人会想,既然csv文件不外就是逗号分隔的纯文本而已,那么,通过循环和split分隔不就好了吗?
  1. csv_text = """姓名,年龄,性别
  2. 张三,25,男
  3. 李四,28,男
  4. 王五,22,男
  5. 六六,29,女
  6. 子柒,28,女"""
  7. for line in csv_text.split("\n")[1::]:
  8.     item = line.split(",")
  9.     print("姓名:", item[0])
  10.     print("年龄:", item[1])
  11.     print("性别:", item[2])
  12.     print()
复制代码
如许做看起来行之有效,而且也非常简朴,轻易理解,但是,不要如许做。由于,在一些情况下,如许会引入错误。比方,当某个项中有逗号的时候,如一个人的名字叫做xu,kun,按照正确的csv文件格式,会写为"xu,kun",并且是符合要求的选项。但是假如利用简朴的split分隔,这个名字也会被拆分开来,从而导致项变多,产生错误。
csv读写

读取csv

在python中存在内置的csv库,因此,利用内置的csv库:
  1. import csv
  2. with open("my_file.csv") as f:
  3.     csv_reader = csv.reader(f, delimiter=",")
  4.     for row in csv_reader:
  5.         print(row)
复制代码
写入csv

  1. import csv
  2. with open("my_file.csv", "w", newline="") as f:
  3.     csv_writer = csv.writer(f, delimiter=",")
  4.     csv_writer.writerow(['姓名', '年龄', '性别'])
  5.     csv_writer.writerow(['张三', '25', '男'])
  6.     csv_writer.writerow(['李四', '28', '男'])
  7.     csv_writer.writerow(['王五', '22', '男'])
  8.     csv_writer.writerow(['六六', '29', '女'])
  9.     csv_writer.writerow(['子柒', '28', '女'])
复制代码
pandas读写csv

读取csv

假如只是为了读写csv,那么直接利用内置的csv库即可。但是,假如为了让pandas利用csv,那么,可以通过pandas直接读写。
  1. import pandas as pd
  2. csv_data = pd.read_csv("my_file.csv")
  3. print(csv_data)
复制代码
写入csv

假如是DataFrame的类型,那么利用:
  1. import pandas as pd
  2. # 如果csv_data已经是DataFrame
  3. csv_data.to_csv("my_file.csv", index=False)
复制代码
假如是通过列表写入,那么利用:
  1. import pandas as pd
  2. data_list = [
  3.     ['姓名', '年龄', '性别'],
  4.     ['张三', '25', '男'],
  5.     ['李四', '28', '男'],
  6.     ['王五', '22', '男'],
  7.     ['六六', '29', '女'],
  8.     ['子柒', '28', '女']
  9. ]
  10. csv_data = pd.DataFrame(data_list[1::], columns=data_list[0])
  11. csv_data.to_csv("my_file.csv", index=False)
复制代码
csv与数据库

从csv读取数据添加到mysql

添加数据自己并不困难,问题在于怎么样自动创建数据表。由于自动选择数据类型可能不能选择到最适合的类型,因此最好还是应该自行创建数据表,然后再进行数据的插入。
  1. import pandas as pd
  2. import pymysql
  3. import os
  4. import re
  5. try:
  6.     conn = pymysql.connect(
  7.         host="数据库地址",
  8.         user="用户名",
  9.         password="密码",
  10.         database="数据库名"
  11.     )
  12.     cursor = conn.cursor()
  13.     print("数据库连接成功!")
  14. except pymysql.MySQLError as e:
  15.     print(f"数据库连接失败:{e}")
  16.     raise
  17. csv_file_path = "my_csv.csv"
  18. df = pd.read_csv(csv_file_path)
  19. df = df.where(pd.notnull(df), None)
  20. table_name = re.sub(r'\W|^(?=\d)', '_', os.path.splitext(os.path.basename(csv_file_path))[0])
  21. def create_table(cursor, table_name, df):
  22.     columns = df.columns
  23.     types = df.dtypes
  24.     sql = f"CREATE TABLE IF NOT EXISTS `{table_name}` (id INT AUTO_INCREMENT PRIMARY KEY, "
  25.     for col, dtype in zip(columns, types):
  26.         if "int" in str(dtype):
  27.             sql += f"`{col}` INT, "
  28.         elif "float" in str(dtype):
  29.             sql += f"`{col}` FLOAT, "
  30.         elif "datetime" in str(dtype):
  31.             sql += f"`{col}` DATETIME, "
  32.         else:
  33.             max_length = df[col].astype(str).map(len).max()
  34.             sql += f"`{col}` VARCHAR({max_length}), "
  35.     sql = sql.rstrip(", ") + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
  36.     try:
  37.         cursor.execute(sql)
  38.         print(f"表 `{table_name}` 创建成功!")
  39.     except pymysql.MySQLError as e:
  40.         print(f"创建表时出错:{e}")
  41.         cursor.close()
  42.         conn.close()
  43.         raise
  44. create_table(cursor, table_name, df)
  45. def insert_data(cursor, table_name, df):
  46.     cols = "`,`".join([str(i) for i in df.columns.tolist()])
  47.     placeholders = ','.join(['%s'] * len(df.columns))
  48.     sql = f"INSERT INTO `{table_name}` (`{cols}`) VALUES ({placeholders})"
  49.     data = df.values.tolist()
  50.     try:
  51.         cursor.executemany(sql, data)
  52.         conn.commit()
  53.         print(f"数据成功插入到表 `{table_name}` 中!")
  54.     except pymysql.MySQLError as e:
  55.         conn.rollback()
  56.         print(f"插入数据时出错:{e}")
  57.         cursor.close()
  58.         conn.close()
  59.         raise
  60. insert_data(cursor, table_name, df)
  61. cursor.close()
  62. conn.close()
复制代码
添加完成以后,即可在mysql数据库中查询到所有结果。

从mysql中读取数据写入csv

  1. import pymysql
  2. import csv
  3. source_conn = pymysql.connect(
  4.     host="源数据库地址",
  5.     user="用户名",
  6.     password="密码",
  7.     database="源数据库名"
  8. )
  9. source_cursor = source_conn.cursor()
  10. source_cursor.execute("SHOW TABLES")
  11. tables = source_cursor.fetchall()
  12. for table in tables:
  13.     table_name = table[0]
  14.     source_cursor.execute(f"SELECT * FROM {table_name}")
  15.     rows = source_cursor.fetchall()
  16.     columns = [desc[0] for desc in source_cursor.description]
  17.     with open(f"{table_name}.csv", "w", newline="", encoding="utf-8") as file:
  18.         writer = csv.writer(file)
  19.         writer.writerow(columns)
  20.         writer.writerows(rows)
  21. source_cursor.close()
  22. source_conn.close()
复制代码
 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表