Python將CSV轉(zhuǎn)Excel的幾種方式匯總
概述
在日常數(shù)據(jù)處理工作中,CSV(逗號分隔值)文件是最常見的數(shù)據(jù)格式之一。但有時我們需要將CSV文件轉(zhuǎn)換為Excel格式以便進行更復(fù)雜的數(shù)據(jù)操作、可視化和共享。Python提供了多種成熟的庫來完成這個任務(wù),各有優(yōu)劣。本文將深入介紹5種實現(xiàn)方式,幫助你選擇最適合的方案。
方式一:pandas(最簡潔)
特點
- ? 代碼最簡潔,僅需一行
- ? 功能完整,支持多sheet轉(zhuǎn)換
- ? 性能優(yōu)秀,適合大文件
- ?? 需要openpyxl或xlsxwriter作為引擎
實現(xiàn)代碼
import pandas as pd
# 基礎(chǔ)用法
df = pd.read_csv('data.csv')
df.to_excel('output.xlsx', index=False)
# 指定sheet名稱
df.to_excel('output.xlsx', sheet_name='數(shù)據(jù)', index=False)
# 多sheet寫入
with pd.ExcelWriter('output.xlsx') as writer:
df1.to_excel(writer, sheet_name='Sheet1', index=False)
df2.to_excel(writer, sheet_name='Sheet2', index=False)
適用場景
- 數(shù)據(jù)分析和處理
- 批量轉(zhuǎn)換多個CSV文件
- 需要保留數(shù)據(jù)格式
方式二:openpyxl(最靈活)
特點
- ? 功能最全面,支持格式化、公式、圖表
- ? 適合復(fù)雜的Excel操作
- ? 可修改現(xiàn)有Excel文件
- ?? 性能稍低,代碼更復(fù)雜
實現(xiàn)代碼
import csv
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
# 創(chuàng)建工作簿
wb = Workbook()
ws = wb.active
ws.title = '數(shù)據(jù)'
# 從CSV讀取數(shù)據(jù)
with open('data.csv', 'r', encoding='utf-8') as f:
csv_reader = csv.reader(f)
for row_idx, row in enumerate(csv_reader, 1):
for col_idx, value in enumerate(row, 1):
cell = ws.cell(row=row_idx, column=col_idx, value=value)
# 第一行格式化為標題
if row_idx == 1:
cell.font = Font(bold=True, color='FFFFFF')
cell.fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
# 自適應(yīng)列寬
for column in ws.columns:
max_length = 0
column_letter = column[0].column_letter
for cell in column:
max_length = max(max_length, len(str(cell.value)))
ws.column_dimensions[column_letter].width = min(max_length + 2, 50)
wb.save('output.xlsx')
適用場景
- 需要自定義格式和樣式
- 添加公式或圖表
- 修改現(xiàn)有Excel文件
方式三:xlsxwriter(高性能)
特點
- ? 性能最快,特別是大文件
- ? 功能豐富,支持圖表
- ? 只寫不讀(寫入速度快)
- ?? 不能修改現(xiàn)有文件,不支持讀操作
實現(xiàn)代碼
import csv
import xlsxwriter
# 創(chuàng)建Excel文件
workbook = xlsxwriter.Workbook('output.xlsx')
worksheet = workbook.add_worksheet('數(shù)據(jù)')
# 定義格式
header_format = workbook.add_format({
'bold': True,
'bg_color': '#4472C4',
'font_color': 'white',
'border': 1
})
data_format = workbook.add_format({
'border': 1,
'align': 'left',
'valign': 'vcenter'
})
# 讀取CSV并寫入Excel
with open('data.csv', 'r', encoding='utf-8') as f:
csv_reader = csv.reader(f)
for row_idx, row in enumerate(csv_reader):
for col_idx, value in enumerate(row):
if row_idx == 0:
worksheet.write(row_idx, col_idx, value, header_format)
else:
worksheet.write(row_idx, col_idx, value, data_format)
# 凍結(jié)首行
worksheet.freeze_panes(1, 0)
workbook.close()
適用場景
- 處理超大CSV文件(百萬行+)
- 需要快速轉(zhuǎn)換
- 簡單的格式需求
方式四:csv模塊 + openpyxl(精細控制)
特點
- ? 對CSV解析控制最細致
- ? 處理特殊字符和編碼
- ? 結(jié)合openpyxl可實現(xiàn)完整功能
- ?? 代碼相對冗長
實現(xiàn)代碼
import csv
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
def csv_to_excel(csv_file, excel_file, sheet_name='Sheet1', encoding='utf-8'):
"""
將CSV轉(zhuǎn)換為Excel
參數(shù):
csv_file: CSV文件路徑
excel_file: 輸出Excel文件路徑
sheet_name: Excel sheet名稱
encoding: 文件編碼
"""
wb = Workbook()
ws = wb.active
ws.title = sheet_name
with open(csv_file, 'r', encoding=encoding) as f:
csv_reader = csv.reader(f)
for row_idx, row in enumerate(csv_reader, 1):
for col_idx, value in enumerate(row, 1):
ws.cell(row=row_idx, column=col_idx, value=value)
wb.save(excel_file)
print(f"? 轉(zhuǎn)換完成: {excel_file}")
# 使用示例
csv_to_excel('data.csv', 'output.xlsx')
適用場景
- 需要處理特殊編碼
- 自定義數(shù)據(jù)驗證邏輯
- 復(fù)雜的CSV結(jié)構(gòu)
方式五:pandas + 樣式美化(專業(yè)級)
特點
- ? 結(jié)合pandas和openpyxl的最佳實踐
- ? 代碼簡潔且功能完整
- ? 輸出專業(yè)美觀
- ? 適合商業(yè)場景
實現(xiàn)代碼
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
def csv_to_excel_pro(csv_file, excel_file, sheet_name='Sheet1'):
"""
將CSV轉(zhuǎn)換為格式化的Excel(專業(yè)級)
"""
# 第一步:使用pandas讀取CSV
df = pd.read_csv(csv_file)
# 第二步:用pandas寫入Excel
df.to_excel(excel_file, sheet_name=sheet_name, index=False)
# 第三步:使用openpyxl美化樣式
wb = load_workbook(excel_file)
ws = wb.active
# 定義樣式
header_fill = PatternFill(start_color='366092', end_color='366092', fill_type='solid')
header_font = Font(bold=True, color='FFFFFF', size=12)
header_alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
# 應(yīng)用樣式到所有單元格
for row in ws.iter_rows(min_row=1, max_row=ws.max_row, min_col=1, max_col=ws.max_column):
for cell in row:
cell.border = border
cell.alignment = Alignment(horizontal='left', vertical='center', wrap_text=True)
# 特殊處理頭行
if cell.row == 1:
cell.fill = header_fill
cell.font = header_font
cell.alignment = header_alignment
# 自適應(yīng)列寬
for column in ws.columns:
max_length = 0
column_letter = column[0].column_letter
for cell in column:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = min(max_length + 2, 50)
ws.column_dimensions[column_letter].width = adjusted_width
# 凍結(jié)首行
ws.freeze_panes = 'A2'
wb.save(excel_file)
print(f"? 專業(yè)級轉(zhuǎn)換完成: {excel_file}")
print(f"?? 數(shù)據(jù)量: {len(df)} 行 × {len(df.columns)} 列")
# 使用示例
csv_to_excel_pro('data.csv', 'output.xlsx', sheet_name='數(shù)據(jù)')
性能對比
| 方式 | 速度 | 功能 | 易用性 | 推薦場景 |
|---|---|---|---|---|
| pandas | ???? | ??? | ????? | 日常數(shù)據(jù)分析 |
| openpyxl | ??? | ????? | ??? | 復(fù)雜格式需求 |
| xlsxwriter | ????? | ???? | ???? | 超大文件處理 |
| csv + openpyxl | ??? | ???? | ??? | 特殊需求 |
| pandas + 美化 | ???? | ????? | ???? | 專業(yè)級報告 |
庫的安裝
# pandas(包含Excel支持) pip install pandas openpyxl # 僅xlsxwriter pip install xlsxwriter # 僅openpyxl pip install openpyxl
常見問題解決
Q1: 編碼問題導(dǎo)致亂碼?
# 使用encoding參數(shù)指定編碼
df = pd.read_csv('data.csv', encoding='gbk') # 或 utf-8, gb2312
Q2: 大文件內(nèi)存溢出?
# 方案1:使用xlsxwriter(流式寫入)
# 方案2:分塊處理
chunks = pd.read_csv('data.csv', chunksize=10000)
for chunk in chunks:
chunk.to_excel('output.xlsx', mode='a')
Q3: 保留原始數(shù)據(jù)類型?
# 指定dtype
df = pd.read_csv('data.csv', dtype={'ID': str, '金額': float})
Q4: 需要多個CSV合并為一個Excel?
import glob
import pandas as pd
# 讀取所有CSV文件
csv_files = glob.glob('*.csv')
with pd.ExcelWriter('merged.xlsx') as writer:
for csv_file in csv_files:
df = pd.read_csv(csv_file)
sheet_name = csv_file.replace('.csv', '')
df.to_excel(writer, sheet_name=sheet_name, index=False)
最佳實踐建議
選擇合適的庫
- 日常使用:優(yōu)先pandas(簡潔高效)
- 格式復(fù)雜:選用openpyxl(功能完整)
- 超大文件:使用xlsxwriter(性能最優(yōu))
數(shù)據(jù)驗證
# 轉(zhuǎn)換前檢查 assert not df.isnull().any().any(), "存在空值" assert len(df) > 0, "數(shù)據(jù)為空"
錯誤處理
try:
df = pd.read_csv('data.csv')
df.to_excel('output.xlsx', index=False)
except FileNotFoundError:
print("? 文件不存在")
except Exception as e:
print(f"? 轉(zhuǎn)換失敗: {e}")
日志記錄
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info(f"成功轉(zhuǎn)換 {len(df)} 行數(shù)據(jù)")
總結(jié)
| 方案 | 優(yōu)先級 | 原因 |
|---|---|---|
| pandas | ????? | 簡潔、高效、功能足夠 |
| openpyxl | ???? | 需要復(fù)雜格式時 |
| xlsxwriter | ???? | 超大文件時 |
建議方案:在大多數(shù)場景下,使用 pandas + openpyxl 的組合方案(方式五)能夠提供最好的平衡——既簡潔易用,又能生成專業(yè)、美觀的輸出。
以上就是Python將CSV轉(zhuǎn)Excel的幾種方式匯總的詳細內(nèi)容,更多關(guān)于Python將CSV轉(zhuǎn)Excel的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python PyQt5運行程序把輸出信息展示到GUI圖形界面上
這篇文章主要介紹了Python PyQt5運行程序把輸出信息展示到GUI圖形界面上,本文通過截圖實例代碼給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
Django2.1集成xadmin管理后臺所遇到的錯誤集錦(填坑)
這篇文章主要介紹了Django2.1集成xadmin管理后臺所遇到的錯誤集錦(填坑),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
使用Pandas?實現(xiàn)MySQL日期函數(shù)的解決方法
這篇文章主要介紹了用Pandas?實現(xiàn)MySQL日期函數(shù)的效果,Python是很靈活的語言,達成同一個目標或有多種途徑,我提供的只是其中一種解決方法,需要的朋友可以參考下2023-02-02

