欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python讀寫csv并將csv數(shù)據(jù)寫入數(shù)據(jù)庫

 更新時間:2024年11月08日 09:20:33   作者:仙草哥哥  
CSV,也即Comma-Separated?Values,是一種用于存儲表格數(shù)據(jù)的純文本文件格式,本文主要介紹了如何使用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編碼字符串的步驟詳解

    Python將GIF動圖轉(zhuǎn)換為Base64編碼字符串的步驟詳解

    在Web開發(fā)中,有時需要將圖像文件(如GIF動圖)轉(zhuǎn)換為Base64編碼的字符串,以便在HTML或CSS中直接嵌入圖像數(shù)據(jù),本文給大家就介紹了一個簡單的教程,教你如何使用Python將GIF動圖轉(zhuǎn)換為Base64編碼的字符串,需要的朋友可以參考下
    2025-02-02
  • Python之web模板應(yīng)用

    Python之web模板應(yīng)用

    這篇文章主要介紹了Python之web模板應(yīng)用,web模板可以更加靈活和方便的控制HTML的顯示,非常具有實用價值,有需要的小伙伴可以參考下
    2017-12-12
  • 利用python/R語言繪制圣誕樹實例代碼

    利用python/R語言繪制圣誕樹實例代碼

    圣誕節(jié)快到了,分別用R和Python繪制了圣誕樹祝你們圣誕節(jié)快樂,所以下面這篇文章主要給大家介紹了關(guān)于如何利用python/R繪制圣誕樹的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • Python?安裝教程以及快速入門

    Python?安裝教程以及快速入門

    Python是一種簡單易學(xué)的編程語言,適合初學(xué)者入門。本文將介紹Python的安裝教程以及快速入門,幫助讀者快速上手Python編程。
    2023-09-09
  • Python實現(xiàn)檢測SSL證書是否過期

    Python實現(xiàn)檢測SSL證書是否過期

    我們知道 SSL 證書是會過期的,一旦過期之后需要重新申請,如果沒有及時更換證書的話,就有可能導(dǎo)致網(wǎng)站出問題,所以本文介紹了如何利用Python實現(xiàn)檢測SSL證書是否過期,需要的可以參考下
    2023-08-08
  • Python OpenCV使用dlib進(jìn)行多目標(biāo)跟蹤詳解

    Python OpenCV使用dlib進(jìn)行多目標(biāo)跟蹤詳解

    這篇文章主要為大家介紹了如何使用 dlib 庫在實時視頻中有效地跟蹤多個對象,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)OpenCV有一定幫助,需要的可以參考一下
    2022-03-03
  • 淺談Python NLP入門教程

    淺談Python NLP入門教程

    本篇文章主要介紹了Python NLP入門教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Flask 上傳自定義頭像的實例詳解

    Flask 上傳自定義頭像的實例詳解

    今天小編就為大家分享一篇Flask 上傳自定義頭像的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python實現(xiàn)提取COCO,VOC數(shù)據(jù)集中特定的類

    python實現(xiàn)提取COCO,VOC數(shù)據(jù)集中特定的類

    這篇文章主要介紹了python實現(xiàn)提取COCO,VOC數(shù)據(jù)集中特定的類,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python使用進(jìn)程池并發(fā)執(zhí)行SQL語句的操作代碼

    Python使用進(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

最新評論