python讀寫(xiě)csv并將csv數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)
csv文件
csv介紹
CSV,也即Comma-Separated Values,是一種用于存儲(chǔ)表格數(shù)據(jù)的純文本文件格式,其中每一行代表一條記錄,記錄中的各個(gè)字段由逗號(hào)分隔。
姓名,年齡,性別
張三,25,男
李四,28,男
王五,22,男
六六,29,女
子柒,28,女
對(duì)于這樣一個(gè)純文本記錄,打開(kāi)以后可能顯示就像這樣:
| 姓名 | 年齡 | 性別 |
| 張三 | 25 | 男 |
| 李四 | 28 | 男 |
| 王五 | 23 | 男 |
| 六六 | 36 | 女 |
| 子柒 | 34 | 女 |
切勿自行讀寫(xiě)csv
很多人會(huì)想,既然csv文件不過(guò)就是逗號(hào)分隔的純文本而已,那么,通過(guò)循環(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()
這樣做看起來(lái)行之有效,而且也非常簡(jiǎn)單,容易理解,但是,不要這樣做。因?yàn)?,在一些情況下,這樣會(huì)引入錯(cuò)誤。例如,當(dāng)某個(gè)項(xiàng)中有逗號(hào)的時(shí)候,如一個(gè)人的名字叫做xu,kun,按照正確的csv文件格式,會(huì)寫(xiě)為"xu,kun",并且是符合要求的選項(xiàng)。但是如果使用簡(jiǎn)單的split分隔,這個(gè)名字也會(huì)被拆分開(kāi)來(lái),從而導(dǎo)致項(xiàng)變多,產(chǎn)生錯(cuò)誤。
csv讀寫(xiě)
讀取csv
在python中存在內(nèi)置的csv庫(kù),因此,使用內(nèi)置的csv庫(kù):
import csv
with open("my_file.csv") as f:
csv_reader = csv.reader(f, delimiter=",")
for row in csv_reader:
print(row)
寫(xiě)入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讀寫(xiě)csv
讀取csv
如果只是為了讀寫(xiě)csv,那么直接使用內(nèi)置的csv庫(kù)即可。但是,如果為了讓pandas使用csv,那么,可以通過(guò)pandas直接讀寫(xiě)。
import pandas as pd
csv_data = pd.read_csv("my_file.csv")
print(csv_data)
寫(xiě)入csv
如果是DataFrame的類型,那么使用:
import pandas as pd
# 如果csv_data已經(jīng)是DataFrame
csv_data.to_csv("my_file.csv", index=False)
如果是通過(guò)列表寫(xiě)入,那么使用:
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ù)庫(kù)
從csv讀取數(shù)據(jù)添加到mysql
添加數(shù)據(jù)本身并不困難,問(wèn)題在于怎么樣自動(dòng)創(chuàng)建數(shù)據(jù)表。由于自動(dòng)選擇數(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ù)庫(kù)地址",
user="用戶名",
password="密碼",
database="數(shù)據(jù)庫(kù)名"
)
cursor = conn.cursor()
print("數(shù)據(jù)庫(kù)連接成功!")
except pymysql.MySQLError as e:
print(f"數(shù)據(jù)庫(kù)連接失?。簕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)建表時(shí)出錯(cuò):{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ù)時(shí)出錯(cuò):{e}")
cursor.close()
conn.close()
raise
insert_data(cursor, table_name, df)
cursor.close()
conn.close()添加完成以后,即可在mysql數(shù)據(jù)庫(kù)中查詢到所有結(jié)果。

從mysql中讀取數(shù)據(jù)寫(xiě)入csv
import pymysql
import csv
source_conn = pymysql.connect(
host="源數(shù)據(jù)庫(kù)地址",
user="用戶名",
password="密碼",
database="源數(shù)據(jù)庫(kù)名"
)
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讀寫(xiě)csv并將csv數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)python讀寫(xiě)csv內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python將GIF動(dòng)圖轉(zhuǎn)換為Base64編碼字符串的步驟詳解
在Web開(kāi)發(fā)中,有時(shí)需要將圖像文件(如GIF動(dòng)圖)轉(zhuǎn)換為Base64編碼的字符串,以便在HTML或CSS中直接嵌入圖像數(shù)據(jù),本文給大家就介紹了一個(gè)簡(jiǎn)單的教程,教你如何使用Python將GIF動(dòng)圖轉(zhuǎn)換為Base64編碼的字符串,需要的朋友可以參考下2025-02-02
利用python/R語(yǔ)言繪制圣誕樹(shù)實(shí)例代碼
圣誕節(jié)快到了,分別用R和Python繪制了圣誕樹(shù)祝你們圣誕節(jié)快樂(lè),所以下面這篇文章主要給大家介紹了關(guān)于如何利用python/R繪制圣誕樹(shù)的相關(guān)資料,需要的朋友可以參考下2021-12-12
Python實(shí)現(xiàn)檢測(cè)SSL證書(shū)是否過(guò)期
我們知道 SSL 證書(shū)是會(huì)過(guò)期的,一旦過(guò)期之后需要重新申請(qǐng),如果沒(méi)有及時(shí)更換證書(shū)的話,就有可能導(dǎo)致網(wǎng)站出問(wèn)題,所以本文介紹了如何利用Python實(shí)現(xiàn)檢測(cè)SSL證書(shū)是否過(guò)期,需要的可以參考下2023-08-08
Python OpenCV使用dlib進(jìn)行多目標(biāo)跟蹤詳解
這篇文章主要為大家介紹了如何使用 dlib 庫(kù)在實(shí)時(shí)視頻中有效地跟蹤多個(gè)對(duì)象,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定幫助,需要的可以參考一下2022-03-03
python實(shí)現(xiàn)提取COCO,VOC數(shù)據(jù)集中特定的類
這篇文章主要介紹了python實(shí)現(xiàn)提取COCO,VOC數(shù)據(jù)集中特定的類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Python使用進(jìn)程池并發(fā)執(zhí)行SQL語(yǔ)句的操作代碼
Python的進(jìn)程池是一種并發(fā)工具,它允許我們將任務(wù)分發(fā)給一組工作進(jìn)程,這些進(jìn)程可以同時(shí)運(yùn)行并共享一個(gè)進(jìn)程池,本文給大家介紹了Python使用進(jìn)程池并發(fā)執(zhí)行SQL語(yǔ)句的操作代碼,需要的朋友可以參考下2024-10-10

