Python實(shí)現(xiàn)批量CSV轉(zhuǎn)Excel的高性能處理方案
一、場(chǎng)景需求
在日常辦公中,我們經(jīng)常需要將CSV格式的數(shù)據(jù)轉(zhuǎn)換為Excel文件。特別是當(dāng)遇到以下情況時(shí):
需要處理數(shù)十萬(wàn)行的大型數(shù)據(jù)文件
要求保留原始數(shù)據(jù)格式(如數(shù)字、文本等)
需要對(duì)表頭和內(nèi)容應(yīng)用不同的樣式
需要批量轉(zhuǎn)換多個(gè)CSV文件
本文將介紹一個(gè)基于Python的高性能解決方案。
二、技術(shù)方案
我們使用pyexcelerate庫(kù)來(lái)實(shí)現(xiàn)高性能的Excel文件生成,相比傳統(tǒng)的openpyxl或pandas,它在處理大規(guī)模數(shù)據(jù)時(shí)速度更快。
| 庫(kù) | 用途 | 安裝 |
|---|---|---|
| pyexcelerate | Excel寫(xiě)入 | pip install pyexcelerate -i https://pypi.tuna.tsinghua.edu.cn/simple/ |
| os | 獲取路徑 | 內(nèi)置庫(kù)無(wú)需安裝 |
| csv | 讀寫(xiě)csv文件 | 內(nèi)置庫(kù)無(wú)需安裝 |
三、核心代碼
核心代碼
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")
# 寫(xiě)入數(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)換完成,耗時(shí):{time.time() - start_time:.2f}秒")
print(f"文件已保存至:{os.path.abspath(excel_path)}")
四、批量處理方案
如果需要批量處理多個(gè)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ù)定義:提前定義好樣式對(duì)象,避免重復(fù)創(chuàng)建
批量寫(xiě)入:雖然示例中是逐個(gè)單元格寫(xiě)入,但pyexcelerate內(nèi)部已做優(yōu)化
類(lèi)型處理:可擴(kuò)展代碼自動(dòng)識(shí)別數(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")
# 寫(xiě)入數(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)換完成,耗時(shí):{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é)
通過(guò)這種方法,我們可以:
- 高效處理數(shù)十萬(wàn)行的大型CSV文件
- 保持?jǐn)?shù)據(jù)的原始格式
- 應(yīng)用專(zhuān)業(yè)的Excel樣式
- 輕松實(shí)現(xiàn)批量轉(zhuǎn)換
對(duì)于需要處理更大數(shù)據(jù)量的場(chǎng)景,還可以考慮分塊讀取CSV文件或使用多線程處理。
到此這篇關(guān)于Python實(shí)現(xiàn)批量CSV轉(zhuǎn)Excel的高性能處理方案的文章就介紹到這了,更多相關(guān)Python批量CSV轉(zhuǎn)Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Keras存在自定義loss或layer怎樣解決load_model報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了Keras存在自定義loss或layer怎樣解決load_model報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
selenium+unittest實(shí)現(xiàn)web自動(dòng)化的示例代碼
本文主要介紹了selenium+unittest實(shí)現(xiàn)web自動(dòng)化的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
使用pyshp包進(jìn)行shapefile文件修改的例子
今天小編就為大家分享一篇使用pyshp包進(jìn)行shapefile文件修改的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python+Selenium實(shí)現(xiàn)在Geoserver批量發(fā)布Mongo矢量數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了如何利用Python+Selenium實(shí)現(xiàn)在 Geoserver批量發(fā)布來(lái)自Mongo中的矢量數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-07-07
tensorflow入門(mén):tfrecord 和tf.data.TFRecordDataset的使用
今天小編就為大家分享一篇tensorflow入門(mén):tfrecord 和tf.data.TFRecordDataset的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01

