【Python】Python在ETL處理的事先準備 - CSV、Excel、SQLite和SQLAlchemy

更新於 發佈於 閱讀時間約 14 分鐘

什麼是ETL?

讓GPT大大來教教我們www

ETL是資料倉儲領域中一個重要的概念,全稱為Extract-Transform-Load,中文可譯為"抽取-轉換-載入"。ETL的作用是將來自不同來源的資料抽取出來,經過清理、轉換、整合等處理後,最終將處理好的資料載入到資料倉儲或其他單一的資料存放區中,為進一步的資料分析做準備。

其中包含三個部分:
- 抽取(Extract):從各種來源系統(如關係型資料庫、檔案等)中抽取出所需的資料。
- 轉換(Transform):對抽取出的原始資料進行清理、轉換、整合等處理,使它們能夠被載入到目標系統。例如解決不一致的問題、轉換資料格式、合併重複資料等。
-載入(Load):將處理好的資料載入到目標資料倉儲或其他資料存放區中,為後續的資料分析、商業智能等做準備。

ETL過程通常是自動化的,透過工具或自行開發的程式來執行。Python同樣可以用於開發ETL流程,利用如Pandas、SQLAlchemy等庫進行資料處理

恩,笨笨的我就把它當作是,對於文檔處理的一個過程吧。那既然提到要處理文檔,python在進行資料處理的,csv、execl、資料庫這些名詞就浮出來了,那本篇想來寫一下這部分。


python處理csv

===== NOTE: 基本讀csv文件的方式 =====

import csv

with open("./DataFile/file.csv", mode="r", newline="", encoding="utf8") as f:
csv_data = csv.reader(f)
for i in csv_data:
print(i)
print(i[1].title())


===== NOTE: 基本寫csv文件的方式 =====

import csv

data = [
['a', 'b', 'c'],
['1', '2', '3'],
['x', 'y', 'z']
]

with open("./OutPutFile/new_file.csv", mode="w", newline="", encoding="utf8") as f:
csv_writer = csv.writer(f, delimiter=",")
for row in data:
csv_writer.writerow(row)


python處理xslx

首先要來了解一下,excel中下方的工作表,在英文中是worksheet

要先安裝指令
> pip install openpyxl

===== NOTE: 基本讀excel文件的方式 =====

from openpyxl import load_workbook

wb = load_workbook("./DataFile/Dodgers.xlsx")
result = []

ws = wb.worksheets[0] # 第一個工作表
for i in ws.iter_rows(): # 選擇行
result.append([j.value for j in i]) # 選擇列

print(result,end="\n")


# TODO: 計算全肥打
sum = 0
for i in result[1:]:
sum+=int(i[11])
print(f"the total homerun:{sum}")

===== NOTE: 基本寫excel文件的方式 =====

讀csv轉成excel

from openpyxl import Workbook
import csv

data_rows = []
with open("./DataFile/file.csv", mode="r", newline="", encoding="utf8") as f:
csv_data = csv.reader(f)
for i in csv_data:
data_rows.append(i)

wb = Workbook()
ws = wb.active
ws.title = "my_file" # 工作表平稱
# 工作表頁籤底色
ws.sheet_properties.tabColor="1072BA"
for i in data_rows:
ws.append(i)

wb.save("./OutputFile/my_file.xlsx")

資料庫 - sqlite3

這邊以sqlite3做示範,因為sqlite3本身就是python的核心liberay之一。

===== NOTE: sqlite3 CRUD =====

這邊直接將CRUD寫在同在一起,再視需求去刪除/下註解(不要傻傻直接複製貼上就執行歐)

import sqlite3

# NOTE:建立db
# sqlite3.connect(":memory:") 會將dn建立在快取記憶體,那當電腦關機時,這個db就會消失
conn = sqlite3.connect("datafile.db")
cursor = conn.cursor()

# 新增資料庫
cursor.execute("""
create table people (
id integer primary key,
name text,
count integer
)
""")
conn.commit() # 執行sql



# NOTE:新增資料
cursor.execute("""
insert into people (name, count) values (?, ?)
""", ("alice", 30))
conn.commit() # 執行sql



# NOTE:取資料(這樣的寫法可以防止sql injection)
result = cursor.execute("""select * from people where name = :username""", {"username":"bob"})
print(result.fetchmany(1)) # 取x筆資料



# NOTE:更新資料
cursor.execute("""
update people set count = 25 where name = 'bob'
""")
conn.commit() # 執行sql
result = cursor.execute("""select * from people""")
print(result.fetchall()) # 取所有資料




# NOTE:刪除資料
cursor.execute("""
delete from people where name = 'bob'
""")
conn.commit() # 執行sql



conn.close() # 關閉資料

SQL alchemy 更好的處理資料

ORM(Object-Relational Mapping)是一種程式設計技術,用於實現物件導向程式設計語言與關聯式資料庫的互操作。其主要目的是通過一個物件虛擬層,將資料庫中的表映射為程式設計語言中的物件,開發人員可以直接使用面向對象的概念來操作資料庫,而不需要編寫大量的 SQL 語句。

安裝指令
> pip install sqlalchemy

===== DOC: ORM - 使用sqlalchemy =====

使用了 SQLAlchemy 的 Core API,通過創建表格對象來操作數據庫

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy.orm import sessionmaker

# NOTE: 根據需求調整
class CFG:
database_name = "datafile.db"
database_server = "sqlite"

# 数据库配置
DATABASE_URL = f"{CFG.database_server}:///{CFG.database_name}"

# 定义模型
engine = create_engine(DATABASE_URL)
metadata = MetaData()

# 創建資料表
people = Table("people", metadata,
Column("id", Integer, primary_key=True),
Column("name", String),
Column("count", Integer)
)
# 创建表
metadata.create_all(engine)

# 初始化数据库
def initialize_database():
Session = sessionmaker(bind=engine)
session = Session()

# NOTE: 插入一条数据
new_person = {"name": "Bob", "count": 40}
session.execute(people.insert(), new_person)
session.commit()

# NOTE: 無條件查询
result = session.query(people).all()
for i in result: print(i)

# NOTE: 有條件查询
result = session.query(people).filter_by(name="Alice").all()
for i in result: print(i)

session.close()

# 执行初始化
if __name__ == "__main__":
initialize_database()

那接下來,引入sqlalchemy

使用了 ORM 功能,通過定義對象和類來映射數據庫表格

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# 定义基类
Base = declarative_base()

# NOTE: 根據需求調整
class CFG:
database_name = "datafile.db"
database_server = "sqlite"


class People(Base):
__tablename__ = "people"
id = Column(Integer, primary_key=True)
name = Column(String)
count = Column(Integer)

def __repr__(self):
return f"<People(id={self.id}, name={self.name}, count={self.count})>"

# 数据库配置
DATABASE_URL = f"{CFG.database_server}:///{CFG.database_name}"

# 创建数据库引擎
engine = create_engine(DATABASE_URL)
Base.metadata.create_all(engine)


# 初始化数据库
def initialize_database():
Session = sessionmaker(bind=engine)
session = Session()

new1 = People(name="Jane", count=5)
new2 = People(name="Mark", count=10)
session.add(new1)
session.add(new2)
session.commit()

# NOTE: 無條件查询
result = session.query(people).all()
for i in result: print(i)

session.close()


# 执行初始化
if __name__ == "__main__":
initialize_database()


🥰以上是本文所分享的內容。如果您發現任何錯誤或遺漏,請不吝賜教。

avatar-img
4會員
10內容數
留言
avatar-img
留言分享你的想法!
W. C. Chen的沙龍 的其他內容
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
啊,,,,,是這個樣子的,這是我今正在做的東西, 目前做到的進度是, unity醬可以上下左右,搭配上timeline預先設定好路線,創造出往前樣子,那第一次寫發射砲彈的東西,就來記錄一下。 子彈(粒子效果) 這邊我還很爛QQ,但網路上有推薦文章,這篇真的介紹的很詳細: Unity Part
這一篇文章,我想來談談模板語言(template language/engine)。而其中比較有名的為handlebar、pug、ejs。那我會的事後兩著,因此拿這兩個出來寫一篇文章。 Pug 指令:npm install pug 比起 HTML 的語法,pug 語法可以說簡潔很多。 那下面
新版Input System 要先來調整設定: (如果日後發現移動不了,可能是這邊有出問題,可以把這邊視為一個檢查點) 下載Input System 在script中的寫法: (這邊的功能是讀取移動的值而已,主要目的是讓unity讀到movement,絕對不是托篇幅的拉🥺) using
今天在練習寫網頁時,剛好要來有做到Dark Mode 的功能,那順便來記錄一下做法~ 首先要先知道Dark Mode的運作原理。是如何知道你現在是Light Mode還是Dark Mode呢? 😀就是這邊拉~當你按下按鈕時,javascript 的toggle()去為<html>增加dark標
當然指令不是背的,所以第一步就是要打開Tailwind CSS的官網。 Installation - Tailwind CSS 主要的方式有CLI跟CDN,這裡使用的方式前者。 Install Tailwind CSS npm install -D tailwindcss npx tai
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
啊,,,,,是這個樣子的,這是我今正在做的東西, 目前做到的進度是, unity醬可以上下左右,搭配上timeline預先設定好路線,創造出往前樣子,那第一次寫發射砲彈的東西,就來記錄一下。 子彈(粒子效果) 這邊我還很爛QQ,但網路上有推薦文章,這篇真的介紹的很詳細: Unity Part
這一篇文章,我想來談談模板語言(template language/engine)。而其中比較有名的為handlebar、pug、ejs。那我會的事後兩著,因此拿這兩個出來寫一篇文章。 Pug 指令:npm install pug 比起 HTML 的語法,pug 語法可以說簡潔很多。 那下面
新版Input System 要先來調整設定: (如果日後發現移動不了,可能是這邊有出問題,可以把這邊視為一個檢查點) 下載Input System 在script中的寫法: (這邊的功能是讀取移動的值而已,主要目的是讓unity讀到movement,絕對不是托篇幅的拉🥺) using
今天在練習寫網頁時,剛好要來有做到Dark Mode 的功能,那順便來記錄一下做法~ 首先要先知道Dark Mode的運作原理。是如何知道你現在是Light Mode還是Dark Mode呢? 😀就是這邊拉~當你按下按鈕時,javascript 的toggle()去為<html>增加dark標
當然指令不是背的,所以第一步就是要打開Tailwind CSS的官網。 Installation - Tailwind CSS 主要的方式有CLI跟CDN,這裡使用的方式前者。 Install Tailwind CSS npm install -D tailwindcss npx tai
你可能也想看
Google News 追蹤
Thumbnail
【vocus 精選投資理財/金融類沙龍,輸入 "moneyback" 年訂閱 9 折】 市場動盪時,加碼永遠值得的投資標的——「自己」 川普政府再度拋出關稅震撼彈,全球市場應聲重挫,從散戶到專業投資人,都急著找尋買進殺出的訊號,就是現在,輪到知識進場!把握時機讓自己升級,別放過反彈的機會!
Thumbnail
就能get 同款 韓系質感包👜 而且獨家下殺 299元up 讓它成為你的 必備單品吧! - momo優惠折扣碼 領取超簡單❤️ 點擊右下角 會員中心 - 折價券 輸入 FLOWERMOMO 點擊歸戶 就能領取 商店優惠券 啦! - https://momo.dm/RaFNzR
Thumbnail
momo店+ S999純銀四葉草項鍊,精緻細膩,代表愛情、希望、信念與幸運,是送給自己或別人的完美禮物。限時下殺299元起,超取免運!
嘿,大家好!上次我們實作出了一個簡單的視窗,雖然有點空蕩蕩,但至少它會乖乖出現對吧?這次我們要讓它變得熱鬧一點,丟幾個實用的「元件」(就是按鈕、文字框之類的東西)進去,讓我們的視窗開始有點互動的感覺。準備好了嗎?來啦!
Thumbnail
subprocess.run() 是 Python 3.5 之後引入的一個簡單且強大的函數,用來執行系統命令並等待命令完成。它是 subprocess 模組的高階 API,封裝了低階的 Popen(),提供了更簡便的方式來執行命令、捕獲輸出、處理錯誤等操作。
Thumbnail
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
Thumbnail
在 Python 中,你可以使用 raise 關鍵字手動觸發錯誤。這對於測試異常處理或在特定情況下停止程式執行非常有用。 本文主說明在影像處理中常見的異常情況,展示如何使用 raise 來觸發不同類型的錯誤。 1. 檔案不存在 (FileNotFoundError) 在影像處理中,如果要讀取
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
Thumbnail
資料前處理(Data Preprocessing)中的重要角色-缺失值處理。從檢查、刪除到填充缺失值,以及插值法和機器學習算法的應用方法。Pandas 缺失值處理基礎方法、進階填充缺失值、鐵達尼號存活預測資料集的示例和機器學習算法填補缺失值方法的介紹與使用。
Thumbnail
【vocus 精選投資理財/金融類沙龍,輸入 "moneyback" 年訂閱 9 折】 市場動盪時,加碼永遠值得的投資標的——「自己」 川普政府再度拋出關稅震撼彈,全球市場應聲重挫,從散戶到專業投資人,都急著找尋買進殺出的訊號,就是現在,輪到知識進場!把握時機讓自己升級,別放過反彈的機會!
Thumbnail
就能get 同款 韓系質感包👜 而且獨家下殺 299元up 讓它成為你的 必備單品吧! - momo優惠折扣碼 領取超簡單❤️ 點擊右下角 會員中心 - 折價券 輸入 FLOWERMOMO 點擊歸戶 就能領取 商店優惠券 啦! - https://momo.dm/RaFNzR
Thumbnail
momo店+ S999純銀四葉草項鍊,精緻細膩,代表愛情、希望、信念與幸運,是送給自己或別人的完美禮物。限時下殺299元起,超取免運!
嘿,大家好!上次我們實作出了一個簡單的視窗,雖然有點空蕩蕩,但至少它會乖乖出現對吧?這次我們要讓它變得熱鬧一點,丟幾個實用的「元件」(就是按鈕、文字框之類的東西)進去,讓我們的視窗開始有點互動的感覺。準備好了嗎?來啦!
Thumbnail
subprocess.run() 是 Python 3.5 之後引入的一個簡單且強大的函數,用來執行系統命令並等待命令完成。它是 subprocess 模組的高階 API,封裝了低階的 Popen(),提供了更簡便的方式來執行命令、捕獲輸出、處理錯誤等操作。
Thumbnail
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
Thumbnail
在 Python 中,你可以使用 raise 關鍵字手動觸發錯誤。這對於測試異常處理或在特定情況下停止程式執行非常有用。 本文主說明在影像處理中常見的異常情況,展示如何使用 raise 來觸發不同類型的錯誤。 1. 檔案不存在 (FileNotFoundError) 在影像處理中,如果要讀取
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
Thumbnail
資料前處理(Data Preprocessing)中的重要角色-缺失值處理。從檢查、刪除到填充缺失值,以及插值法和機器學習算法的應用方法。Pandas 缺失值處理基礎方法、進階填充缺失值、鐵達尼號存活預測資料集的示例和機器學習算法填補缺失值方法的介紹與使用。