Python自動化辦公之處理CSV和Excel文件的操作指南
前言
面向數(shù)據(jù)分析、報表生成與系統(tǒng)集成的日常工作,CSV 與 Excel 幾乎是最常用的兩種表格數(shù)據(jù)格式。本文以實(shí)戰(zhàn)為導(dǎo)向,系統(tǒng)講解如何在 Python 中高效、穩(wěn)健地讀寫 CSV 和 Excel,覆蓋常見坑點(diǎn)與性能優(yōu)化策略,并給出可直接復(fù)制使用的代碼示例。
適用讀者與目標(biāo)
- 需要在后端或數(shù)據(jù)腳本中批量導(dǎo)入/導(dǎo)出表格數(shù)據(jù)
- 想提升對編碼、空值、類型轉(zhuǎn)換、性能的掌控
- 希望擁有一份可作為速查手冊的實(shí)用指南
庫選型與安裝
- 標(biāo)準(zhǔn)庫:
csv讀寫 CSV,無需安裝。 - 主力庫:
pandas處理結(jié)構(gòu)化數(shù)據(jù),CSV/Excel 通吃。 - Excel 專用:
openpyxl讀寫.xlsx;xlsxwriter適合寫入時的樣式與大文件優(yōu)化。
安裝示例:
pip install pandas openpyxl xlsxwriter
讀取 CSV(標(biāo)準(zhǔn)庫 csv)
import csv
from pathlib import Path
path = Path("data.csv")
with path.open("r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
pass
使用字典形式更便于字段訪問:
import csv
from pathlib import Path
with Path("data.csv").open("r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for record in reader:
pass
寫入 CSV(標(biāo)準(zhǔn)庫 csv)
import csv
from pathlib import Path
rows = [["id", "name", "score"], [1, "張三", 95]]
with Path("out.csv").open("w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
for row in rows:
writer.writerow(row)
寫入帶表頭的字典:
import csv
from pathlib import Path
records = [
{"id": 1, "name": "張三", "score": 95},
{"id": 2, "name": "李四", "score": 88},
]
fieldnames = ["id", "name", "score"]
with Path("out_dict.csv").open("w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(records)
使用 pandas 讀寫 CSV
讀?。?/p>
import pandas as pd
df = pd.read_csv("data.csv", encoding="utf-8")
寫入:
df.to_csv("out.csv", index=False, encoding="utf-8")
逐塊讀取大文件:
import pandas as pd
for chunk in pd.read_csv("big.csv", chunksize=100_000):
pass
只讀部分列并指定類型:
import pandas as pd
df = pd.read_csv(
"data.csv",
usecols=["id", "name", "score"],
dtype={"id": "Int64", "name": "string", "score": "float64"},
)
編碼與本地化要點(diǎn)(Windows/Excel 友好)
- Excel 偏好
UTF-8-SIG或本地 ANSI。為兼容 Excel,寫入 CSV 時可用utf-8-sig。 - Windows 上換行符用
newline=""交由csv控制,避免出現(xiàn)空行。 - 含中文數(shù)據(jù)建議統(tǒng)一使用
utf-8或utf-8-sig。
示例:
import csv
from pathlib import Path
with Path("excel_friendly.csv").open("w", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f)
writer.writerow(["編號", "姓名", "備注"])
pandas 側(cè):
import pandas as pd
df = pd.DataFrame({"編號": [1, 2], "姓名": ["張三", "李四"]})
df.to_csv("excel_friendly.csv", index=False, encoding="utf-8-sig")
讀取 Excel(.xlsx)
使用 pandas:
import pandas as pd
df = pd.read_excel("workbook.xlsx", sheet_name=0, engine="openpyxl")
指定列與類型:
import pandas as pd
df = pd.read_excel(
"workbook.xlsx",
sheet_name="Sheet1",
usecols=["id", "name", "score"],
dtype={"id": "Int64", "name": "string", "score": "float64"},
engine="openpyxl",
)
使用 openpyxl 原生讀?。?/p>
from openpyxl import load_workbook
wb = load_workbook("workbook.xlsx", read_only=True)
ws = wb.active
for row in ws.iter_rows(values_only=True):
pass
wb.close()
寫入 Excel 與多工作表
pandas 寫入多個工作表:
import pandas as pd
with pd.ExcelWriter("report.xlsx", engine="xlsxwriter") as writer:
df1 = pd.DataFrame({"id": [1, 2], "name": ["張三", "李四"]})
df2 = pd.DataFrame({"id": [3, 4], "name": ["王五", "趙六"]})
df1.to_excel(writer, sheet_name="用戶A", index=False)
df2.to_excel(writer, sheet_name="用戶B", index=False)
openpyxl 創(chuàng)建并寫入:
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "數(shù)據(jù)"
ws.append(["id", "name", "score"])
ws.append([1, "張三", 95])
wb.save("simple.xlsx")
樣式、公式與格式(Excel)
使用 xlsxwriter 設(shè)置樣式:
import pandas as pd
with pd.ExcelWriter("styled.xlsx", engine="xlsxwriter") as writer:
df = pd.DataFrame({"金額": [1234.5, 6789.01]})
df.to_excel(writer, sheet_name="Sheet1", index=False)
workbook = writer.book
worksheet = writer.sheets["Sheet1"]
fmt = workbook.add_format({"num_format": "#,##0.00", "bold": True})
worksheet.set_column("A:A", 12, fmt)
插入公式(openpyxl):
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
wb = Workbook()
ws = wb.active
ws.append(["單價", "數(shù)量", "總價"])
ws.append([10, 2, None])
ws["C2"] = "=A2*B2"
wb.save("formula.xlsx")
類型、缺失值與前導(dǎo)零
- 賬單號、電話號碼等標(biāo)識碼使用字符串類型,避免前導(dǎo)零丟失。
- pandas 讀寫時可指定
dtype=str或使用converters保留格式。 - 缺失值處理可使用
na_filter=False或keep_default_na=False。
示例:
import pandas as pd
df = pd.read_csv(
"ids.csv",
dtype={"bill_no": "string", "phone": "string"},
keep_default_na=False,
)
CSV ↔ Excel 轉(zhuǎn)換
CSV 轉(zhuǎn) Excel:
import pandas as pd
df = pd.read_csv("data.csv")
df.to_excel("data.xlsx", index=False)
Excel 轉(zhuǎn) CSV:
import pandas as pd
df = pd.read_excel("data.xlsx", engine="openpyxl")
df.to_csv("data.csv", index=False, encoding="utf-8")
多工作表合并讀取:
import pandas as pd
xls = pd.ExcelFile("book.xlsx", engine="openpyxl")
frames = [xls.parse(name) for name in xls.sheet_names]
merged = pd.concat(frames, ignore_index=True)
大文件與性能優(yōu)化
- 流式讀?。簆andas
chunksize,openpyxlread_only=True與iter_rows。 - 避免不必要的類型推斷與解析,顯式傳入
dtype、usecols。 - 寫入 Excel 時使用
xlsxwriter,速度更優(yōu),內(nèi)存占用更穩(wěn)。 - pandas 2.x 可嘗試
engine="pyarrow"讀取 CSV 以提升解析速度。
示例:
import pandas as pd
for chunk in pd.read_csv("big.csv", chunksize=200_000):
pass
openpyxl 寫入大文件:
from openpyxl import Workbook
wb = Workbook(write_only=True)
ws = wb.create_sheet("數(shù)據(jù)")
for i in range(1_000_000):
ws.append([i, f"name_{i}"])
wb.save("big.xlsx")
常見坑點(diǎn)與規(guī)避
- Excel 的最大行數(shù)約 1048576,超出需拆分或改用 CSV。
- Excel 可能將長數(shù)字自動格式化為科學(xué)計數(shù)法,讀寫時統(tǒng)一為字符串類型。
- CSV 分隔符可能不是逗號,注意使用
sep或delimiter。 - 字段中包含逗號或換行時需使用引號,pandas 自動處理,標(biāo)準(zhǔn)庫需配置
quotechar。 - Windows 上若出現(xiàn) CSV 空行,檢查寫入文件是否設(shè)置
newline=""。
迷你速查
- 讀 CSV:
pd.read_csv("file.csv") - 寫 CSV:
df.to_csv("file.csv", index=False) - 讀 Excel:
pd.read_excel("file.xlsx", engine="openpyxl") - 寫 Excel:
pd.ExcelWriter("file.xlsx", engine="xlsxwriter") - 兼容 Excel 的 CSV 編碼:
encoding="utf-8-sig" - 大文件分塊:
pd.read_csv(..., chunksize=...) - 指定列與類型:
usecols=...、dtype=...
結(jié)語
掌握 CSV 與 Excel 的讀寫不僅是數(shù)據(jù)工程的基本功,更是提升系統(tǒng)集成與數(shù)據(jù)流轉(zhuǎn)效率的關(guān)鍵。將本文的示例與策略納入你的項(xiàng)目骨架,可以顯著降低編碼與格式問題帶來的不確定性,并在大數(shù)據(jù)量場景下獲得穩(wěn)定的性能表現(xiàn)。
到此這篇關(guān)于Python自動化辦公之處理CSV和Excel文件的操作指南的文章就介紹到這了,更多相關(guān)Python處理CSV和Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python2及Python3如何實(shí)現(xiàn)兼容切換
這篇文章主要介紹了Python2及Python3如何實(shí)現(xiàn)兼容切換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
解決Python Matplotlib繪圖數(shù)據(jù)點(diǎn)位置錯亂問題
這篇文章主要介紹了解決Python Matplotlib繪圖數(shù)據(jù)點(diǎn)位置錯亂問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python實(shí)現(xiàn)樹莓派攝像頭持續(xù)錄像并傳送到主機(jī)的步驟
這篇文章主要介紹了Python實(shí)現(xiàn)樹莓派攝像頭持續(xù)錄像并傳送到主機(jī)的步驟,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-11-11
Pyinstaller+Pipenv打包Python文件的實(shí)現(xiàn)示例
相信大家都試過將Python文件進(jìn)行打包,本文主要介紹了Pyinstaller+Pipenv打包Python文件,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
python讀取浮點(diǎn)數(shù)和讀取文本文件示例
這篇文章主要介紹了python讀取浮點(diǎn)數(shù)和讀取文本文件示例,需要的朋友可以參考下2014-05-05
python fabric實(shí)現(xiàn)遠(yuǎn)程操作和部署示例
這篇文章主要介紹了python使用fabric實(shí)現(xiàn)遠(yuǎn)程操作和部署示例,需要的朋友可以參考下2014-03-03
Python中Generators教程的實(shí)現(xiàn)
本文主要介紹了Python中Generators教程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02

