2017-11-13 22 views
0

重い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 
+0

'pandas'を試してください。はるかに短いコードも得られます: 'import pandas as pd; df = pd.read_excel( '/ path/to/excel.xlsx'); df.to_csv( '/ path/to/csv_file.csv') ' – DeepSpace

+0

@DeepSpace Pandasは内部的にxlrdを使ってファイルを読み込んで列を列に変換するので、これは素晴らしい考えではありません。 –

+0

だから私はこれを試しました。 'pandas'は' openpyxl'よりも遅いことが分かります。 6枚(それぞれ100K行)のファイルを数えて7分以上経過しています。 –

答えて

0

読み取り専用モードを使用すると、ワークシートを読んで、並行してCSVを書くことができる必要があります:

この

は私が現在使用しているコードです。これ以外にもできることはたくさんあるとは思いません.XMLをPythonに変換することはおそらくボトルネックです。

+0

これをどのように並行して行うのですか? –

+0

'asyncio'を使ってコルーチンを書く必要があります。一つのコルーチンは単純にワークシートを生成します。 –

関連する問題