重いcsvファイルからデータを取り込んでデータをアップロードするアプリでは、Excelファイルからデータをインポートする必要がありました。このために、私はまずxlrd
を使ってExcelファイルをcsvに変換しました。これは小さなファイルには効果的でしたが、大きなファイルを変換するには時間がかかりました。 1m行ずつ6枚のファイルを提出したとき、プロセスを終了するまでに40分待っていました。待つ時間が長すぎたためです。大きなExcelファイルをCSVに変換
現在、私は、ExcelファイルをCSVファイルに変換するにはopenmyxl
ライブラリを使用していますし、このライブラリはxlrd
よりも大幅に高速である、特にread-only
モードでは、しかし、悲しいことに、重いファイルの変換のための8-10分のさえ遅延があまりにもあります多く。
Pythonで時間のかかる効率的なソリューションがあります。ここで、数分待たずに複数のシートで大規模なExcelファイルを変換できますか?
def convertExcelToCSV(excelFilePath, uploadFilePath):
lstCSVFilePaths = []
workbook = load_workbook(excelFilePath, read_only=True)
for worksheet_name in workbook.get_sheet_names():
worksheet = workbook.get_sheet_by_name(name = worksheet_name)
#skip sheet if empty
if worksheet.rows == 0: continue
objCSV = {}
objCSV["fileName"] = worksheet_name + '.csv'
objCSV["isGZip"] = False
csvFilePath = uploadFilePath + "CSV Files/"
#make directory for CSV files that will be made from Excel file
if not os.path.exists(csvFilePath):
os.makedirs(csvFilePath)
fd, csvFilePath = tempfile.mkstemp(suffix=worksheet_name + ".csv", dir=csvFilePath)
objCSV["filePath"] = csvFilePath
with open(csvFilePath, 'w', newline="") as your_csv_file:
wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL)
for rownum in worksheet.rows:
wr.writerow([cell.value for cell in rownum])
your_csv_file.close()
lstCSVFilePaths.append(objCSV)
return lstCSVFilePaths
'pandas'を試してください。はるかに短いコードも得られます: 'import pandas as pd; df = pd.read_excel( '/ path/to/excel.xlsx'); df.to_csv( '/ path/to/csv_file.csv') ' – DeepSpace
@DeepSpace Pandasは内部的にxlrdを使ってファイルを読み込んで列を列に変換するので、これは素晴らしい考えではありません。 –
だから私はこれを試しました。 'pandas'は' openpyxl'よりも遅いことが分かります。 6枚(それぞれ100K行)のファイルを数えて7分以上経過しています。 –