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()
這樣做看起來行之有效,而且也非常簡單,容易理解,但是,不要這樣做。因為,在一些情況下,這樣會引入錯誤。例如,當某個項中有逗號的時候,如一個人的名字叫做xu,kun,按照正確的csv文件格式,會寫為"xu,kun",并且是符合要求的選項。但是如果使用簡單的split分隔,這個名字也會被拆分開來,從而導致項變多,產(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ù)類型可能不能選擇到最適合的類型,因此最好還是應該自行創(chuàng)建數(shù)據(jù)表,然后再進行數(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ù)庫中查詢到所有結果。

從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()到此這篇關于python讀寫csv并將csv數(shù)據(jù)寫入數(shù)據(jù)庫的文章就介紹到這了,更多相關python讀寫csv內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python將GIF動圖轉換為Base64編碼字符串的步驟詳解
在Web開發(fā)中,有時需要將圖像文件(如GIF動圖)轉換為Base64編碼的字符串,以便在HTML或CSS中直接嵌入圖像數(shù)據(jù),本文給大家就介紹了一個簡單的教程,教你如何使用Python將GIF動圖轉換為Base64編碼的字符串,需要的朋友可以參考下2025-02-02
python實現(xiàn)提取COCO,VOC數(shù)據(jù)集中特定的類
這篇文章主要介紹了python實現(xiàn)提取COCO,VOC數(shù)據(jù)集中特定的類,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Python使用進程池并發(fā)執(zhí)行SQL語句的操作代碼
Python的進程池是一種并發(fā)工具,它允許我們將任務分發(fā)給一組工作進程,這些進程可以同時運行并共享一個進程池,本文給大家介紹了Python使用進程池并發(fā)執(zhí)行SQL語句的操作代碼,需要的朋友可以參考下2024-10-10

