在数据处理和分析中,将CSV文件中的数据导入数据库是一个常见的任务。Python作为一种强大的编程语言,提供了多种方法来实现这一目标。本文将详细介绍如何使用Python将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文件开始,逐步介绍了如何连接数据库、创建数据表以及将CSV数据插入数据库。这些步骤不仅能够帮助读者完成基本的数据导入任务,还能够为更复杂的数据处理和分析打下坚实的基础。希望本文的内容能够为您的Python数据处理之旅提供有力支持,让您的数据操作更加高效和准确。
本文来源于#仙草哥哥,由@蜜芽 整理发布。如若内容造成侵权/违法违规/事实不符,请联系本站客服处理!
该文章观点仅代表作者本人,不代表本站立场。本站不承担相关法律责任。
如若转载,请注明出处:https://www.zhanid.com/biancheng/2245.html