Python實現(xiàn)批量CSV轉(zhuǎn)Excel的高性能處理方案
一、場景需求
在日常辦公中,我們經(jīng)常需要將CSV格式的數(shù)據(jù)轉(zhuǎn)換為Excel文件。特別是當(dāng)遇到以下情況時:
需要處理數(shù)十萬行的大型數(shù)據(jù)文件
要求保留原始數(shù)據(jù)格式(如數(shù)字、文本等)
需要對表頭和內(nèi)容應(yīng)用不同的樣式
需要批量轉(zhuǎn)換多個CSV文件
本文將介紹一個基于Python的高性能解決方案。
二、技術(shù)方案
我們使用pyexcelerate庫來實現(xiàn)高性能的Excel文件生成,相比傳統(tǒng)的openpyxl或pandas,它在處理大規(guī)模數(shù)據(jù)時速度更快。
| 庫 | 用途 | 安裝 |
|---|---|---|
| pyexcelerate | Excel寫入 | pip install pyexcelerate -i https://pypi.tuna.tsinghua.edu.cn/simple/ |
| os | 獲取路徑 | 內(nèi)置庫無需安裝 |
| csv | 讀寫csv文件 | 內(nèi)置庫無需安裝 |
三、核心代碼
核心代碼
import csv
import os
import time
from pyexcelerate import Workbook, Style, Font, Fill, Color, Alignment
# 預(yù)定義表頭樣式
header_style = Style(
font=Font(bold=True, size=9, color=Color(255, 255, 255), family='Arial'),
fill=Fill(background=Color(192, 0, 0)), # 紅色背景
alignment=Alignment(horizontal='center', vertical='center')
)
# 單元格樣式(普通文本)
content_style = Style(
font=Font(size=9, family='Arial'),
alignment=Alignment(horizontal='center', vertical='center')
)
def csv_to_excel(csv_path, excel_path):
"""將CSV文件轉(zhuǎn)換為Excel文件"""
start_time = time.time()
# 讀取CSV數(shù)據(jù)
with open(csv_path, 'r', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
header = next(reader)
data = list(reader)
# 創(chuàng)建Excel工作簿
wb = Workbook()
ws = wb.new_sheet("Sheet1")
# 寫入數(shù)據(jù)并應(yīng)用樣式
for row_idx, row_data in enumerate([header] + data, start=1):
for col_idx, value in enumerate(row_data, start=1):
ws.set_cell_value(row_idx, col_idx, value)
ws.set_cell_style(row_idx, col_idx,
header_style if row_idx == 1 else content_style)
# 保存Excel文件
os.makedirs(os.path.dirname(excel_path), exist_ok=True)
wb.save(excel_path)
print(f"轉(zhuǎn)換完成,耗時:{time.time() - start_time:.2f}秒")
print(f"文件已保存至:{os.path.abspath(excel_path)}")
四、批量處理方案
如果需要批量處理多個CSV文件,可以使用以下代碼:
def batch_convert(csv_folder, output_folder):
"""批量轉(zhuǎn)換文件夾中的所有CSV文件"""
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for filename in os.listdir(csv_folder):
if filename.endswith('.csv'):
csv_path = os.path.join(csv_folder, filename)
excel_name = os.path.splitext(filename)[0] + '.xlsx'
excel_path = os.path.join(output_folder, excel_name)
print(f"正在處理: {filename}")
csv_to_excel(csv_path, excel_path)
五、性能優(yōu)化
樣式預(yù)定義:提前定義好樣式對象,避免重復(fù)創(chuàng)建
批量寫入:雖然示例中是逐個單元格寫入,但pyexcelerate內(nèi)部已做優(yōu)化
類型處理:可擴展代碼自動識別數(shù)字列并轉(zhuǎn)換格式
六、使用示例
if __name__ == "__main__":
# 單文件轉(zhuǎn)換
csv_to_excel('input.csv', 'output/output.xlsx')
# 批量轉(zhuǎn)換
batch_convert('csv_files', 'excel_outputs')
完整代碼
import csv
import os
import time
from pyexcelerate import Workbook, Style, Font, Fill, Color, Alignment
# 預(yù)定義表頭樣式
header_style = Style(
font=Font(bold=True, size=9, color=Color(255, 255, 255), family='Arial'),
fill=Fill(background=Color(192, 0, 0)), # 紅色背景
alignment=Alignment(horizontal='center', vertical='center')
)
# 單元格樣式(普通文本)
content_style = Style(
font=Font(size=9, family='Arial'),
alignment=Alignment(horizontal='center', vertical='center')
)
def csv_to_excel(csv_path, excel_path):
"""將CSV文件轉(zhuǎn)換為Excel文件"""
start_time = time.time()
# 讀取CSV數(shù)據(jù)
with open(csv_path, 'r', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
header = next(reader)
data = list(reader)
# 創(chuàng)建Excel工作簿
wb = Workbook()
ws = wb.new_sheet("Sheet1")
# 寫入數(shù)據(jù)并應(yīng)用樣式
for row_idx, row_data in enumerate([header] + data, start=1):
for col_idx, value in enumerate(row_data, start=1):
ws.set_cell_value(row_idx, col_idx, value)
ws.set_cell_style(row_idx, col_idx,
header_style if row_idx == 1 else content_style)
# 保存Excel文件
os.makedirs(os.path.dirname(excel_path), exist_ok=True)
wb.save(excel_path)
print(f"轉(zhuǎn)換完成,耗時:{time.time() - start_time:.2f}秒")
print(f"文件已保存至:{os.path.abspath(excel_path)}")
def batch_convert(csv_folder, output_folder):
"""批量轉(zhuǎn)換文件夾中的所有CSV文件"""
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for filename in os.listdir(csv_folder):
if filename.endswith('.csv'):
csv_path = os.path.join(csv_folder, filename)
excel_name = os.path.splitext(filename)[0] + '.xlsx'
excel_path = os.path.join(output_folder, excel_name)
print(f"正在處理: {filename}")
csv_to_excel(csv_path, excel_path)
if __name__ == "__main__":
# 單文件轉(zhuǎn)換
csv_to_excel('input.csv', 'output/output.xlsx')
# 批量轉(zhuǎn)換
batch_convert('csv_files', 'excel_outputs')
七、小結(jié)
通過這種方法,我們可以:
- 高效處理數(shù)十萬行的大型CSV文件
- 保持?jǐn)?shù)據(jù)的原始格式
- 應(yīng)用專業(yè)的Excel樣式
- 輕松實現(xiàn)批量轉(zhuǎn)換
對于需要處理更大數(shù)據(jù)量的場景,還可以考慮分塊讀取CSV文件或使用多線程處理。
到此這篇關(guān)于Python實現(xiàn)批量CSV轉(zhuǎn)Excel的高性能處理方案的文章就介紹到這了,更多相關(guān)Python批量CSV轉(zhuǎn)Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pytorch上下采樣函數(shù)之F.interpolate數(shù)組采樣操作詳解
最近用到了上采樣下采樣操作,pytorch中使用interpolate可以很輕松的完成,下面這篇文章主要給大家介紹了關(guān)于Pytorch上下采樣函數(shù)之F.interpolate數(shù)組采樣操作的相關(guān)資料,需要的朋友可以參考下2022-04-04
Python實現(xiàn)簡單音頻數(shù)據(jù)壓縮與解壓算法
在數(shù)字信號處理中,壓縮技術(shù)被廣泛應(yīng)用于減少文件大小或傳輸帶寬,對于音頻數(shù)據(jù)而言,通常會使用復(fù)雜的壓縮算法如MP3、AAC等,但這些算法往往需要專門的庫和對底層原理的理解,在這篇博客中,我們將探索一種簡單的自定義壓縮方法,并用Python實現(xiàn)它,需要的朋友可以參考下2025-06-06
Python3爬蟲學(xué)習(xí)之MySQL數(shù)據(jù)庫存儲爬取的信息詳解
這篇文章主要介紹了Python3爬蟲學(xué)習(xí)之MySQL數(shù)據(jù)庫存儲爬取的信息,涉及Python3針對mysql數(shù)據(jù)庫的連接、信息存儲等相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
Python操作sqlite3快速、安全插入數(shù)據(jù)(防注入)的實例
這篇文章主要介紹了Python操作sqlite3快速、安全插入數(shù)據(jù)(防注入)的實例,通過在一個表格中進(jìn)行操作來論述如何使用Python快速安全地操作sqlite3,需要的朋友可以參考下2014-04-04
淺析Python如何在Word文檔中插入數(shù)學(xué)公式
將數(shù)學(xué)公式直接嵌入文檔中,不僅能夠提升文檔的專業(yè)水準(zhǔn),還能實現(xiàn)公式的自動更新和動態(tài)計算,從而有效提升工作效率和內(nèi)容的準(zhǔn)確性,下面我們就來看看如何使用 Python 在 Word 文檔中插入數(shù)學(xué)公式2025-06-06
OpenCV+python實現(xiàn)實時目標(biāo)檢測功能
這篇文章主要介紹了OpenCV+python實現(xiàn)實時目標(biāo)檢測功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
pyqt6的本地環(huán)境部署(conda和vscode環(huán)境)
本文主要介紹了pyqt6的本地環(huán)境部署(conda和vscode環(huán)境),文中通過示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05

