python讀寫csv并將csv數(shù)據(jù)寫入數(shù)據(jù)庫
csv文件
csv介紹
CSV,也即Comma-Separated Values,是一種用于存儲表格數(shù)據(jù)的純文本文件格式,其中每一行代表一條記錄,記錄中的各個字段由逗號分隔。
姓名,年齡,性別
張三,25,男
李四,28,男
王五,22,男
六六,29,女
子柒,28,女
對于這樣一個純文本記錄,打開以后可能顯示就像這樣:
姓名 | 年齡 | 性別 |
張三 | 25 | 男 |
李四 | 28 | 男 |
王五 | 23 | 男 |
六六 | 36 | 女 |
子柒 | 34 | 女 |
切勿自行讀寫csv
很多人會想,既然csv文件不過就是逗號分隔的純文本而已,那么,通過循環(huán)和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()
這樣做看起來行之有效,而且也非常簡單,容易理解,但是,不要這樣做。因為,在一些情況下,這樣會引入錯誤。例如,當(dāng)某個項中有逗號的時候,如一個人的名字叫做xu,kun,按照正確的csv文件格式,會寫為"xu,kun",并且是符合要求的選項。但是如果使用簡單的split分隔,這個名字也會被拆分開來,從而導(dǎo)致項變多,產(chǎn)生錯誤。
csv讀寫
讀取csv
在python中存在內(nèi)置的csv庫,因此,使用內(nèi)置的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,那么直接使用內(nèi)置的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已經(jīng)是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與數(shù)據(jù)庫
從csv讀取數(shù)據(jù)添加到mysql
添加數(shù)據(jù)本身并不困難,問題在于怎么樣自動創(chuàng)建數(shù)據(jù)表。由于自動選擇數(shù)據(jù)類型可能不能選擇到最適合的類型,因此最好還是應(yīng)該自行創(chuàng)建數(shù)據(jù)表,然后再進(jìn)行數(shù)據(jù)的插入。
import pandas as pd import pymysql import os import re try: conn = pymysql.connect( host="數(shù)據(jù)庫地址", user="用戶名", password="密碼", database="數(shù)據(jù)庫名" ) cursor = conn.cursor() print("數(shù)據(jù)庫連接成功!") except pymysql.MySQLError as e: print(f"數(shù)據(jù)庫連接失敗:{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}` 創(chuàng)建成功!") except pymysql.MySQLError as e: print(f"創(chuàng)建表時出錯:{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"數(shù)據(jù)成功插入到表 `{table_name}` 中!") except pymysql.MySQLError as e: conn.rollback() print(f"插入數(shù)據(jù)時出錯:{e}") cursor.close() conn.close() raise insert_data(cursor, table_name, df) cursor.close() conn.close()
添加完成以后,即可在mysql數(shù)據(jù)庫中查詢到所有結(jié)果。
從mysql中讀取數(shù)據(jù)寫入csv
import pymysql import csv source_conn = pymysql.connect( host="源數(shù)據(jù)庫地址", user="用戶名", password="密碼", database="源數(shù)據(jù)庫名" ) 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()
到此這篇關(guān)于python讀寫csv并將csv數(shù)據(jù)寫入數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)python讀寫csv內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python將GIF動圖轉(zhuǎn)換為Base64編碼字符串的步驟詳解
在Web開發(fā)中,有時需要將圖像文件(如GIF動圖)轉(zhuǎn)換為Base64編碼的字符串,以便在HTML或CSS中直接嵌入圖像數(shù)據(jù),本文給大家就介紹了一個簡單的教程,教你如何使用Python將GIF動圖轉(zhuǎn)換為Base64編碼的字符串,需要的朋友可以參考下2025-02-02Python OpenCV使用dlib進(jìn)行多目標(biāo)跟蹤詳解
這篇文章主要為大家介紹了如何使用 dlib 庫在實時視頻中有效地跟蹤多個對象,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)OpenCV有一定幫助,需要的可以參考一下2022-03-03python實現(xiàn)提取COCO,VOC數(shù)據(jù)集中特定的類
這篇文章主要介紹了python實現(xiàn)提取COCO,VOC數(shù)據(jù)集中特定的類,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Python使用進(jìn)程池并發(fā)執(zhí)行SQL語句的操作代碼
Python的進(jìn)程池是一種并發(fā)工具,它允許我們將任務(wù)分發(fā)給一組工作進(jìn)程,這些進(jìn)程可以同時運行并共享一個進(jìn)程池,本文給大家介紹了Python使用進(jìn)程池并發(fā)執(zhí)行SQL語句的操作代碼,需要的朋友可以參考下2024-10-10