2017-11-13 8 views
0

무거운 csv 파일에서 데이터를 가져 와서 데이터를 업로드하는 앱에서 Excel 파일의 데이터를 가져와야했습니다. 이를 위해 처음에는 xlrd을 사용하여 Excel 파일을 CSV 파일로 변환했습니다.이 파일은 작은 파일에는 효과적 이었지만 큰 파일은 변환하는 데 많은 시간이 걸렸습니다. 각 줄이 1m 인 6 장짜리 파일을 받았을 때 대기 시간이 너무 길어서 프로세스를 종료하기 전에 40 분을 기다렸습니다. 무거운 파일의 변환 8-10 분에도 지연은 너무 슬프게도, 큰 Excel 파일을 CSV로 변환

은 현재 내가 CSV로 엑셀 파일을 변환 openmyxl 라이브러리를 사용하고 있는데,이 라이브러리는 특히 read-only 모드에서 xlrd보다 훨씬 빠르지 만, 많은.

몇 분 정도 기다리지 않고도 여러 장이있는 큰 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

'팬더'를 사용해보세요. 훨씬 더 짧은 코드도 얻을 수 있습니다 :'import pandas as pd; df = pd.read_excel ('/ path/to/excel.xlsx'); df.to_csv ('/ path/to/csv_file.csv')' – DeepSpace

+0

@DeepSpace 팬더가 내부적으로 xlrd를 사용하여 파일을 읽고 행을 열로 변환하는 것을 보는 DisSpace는 좋은 생각이 아닙니다. –

+0

그래서 나는 이것을 시도했다. "pandas"는'openpyxl'보다 느리다. 6 장 (각 100K 줄)의 파일과 카운트로 7 분 이상되었습니다. –

답변

0

읽기 전용 모드를 사용하면 워크 시트를 읽고 병렬로 CSV를 쓸 수 있어야 :

내가 현재 사용하고 코드입니다. 이 외에도 나는 할 수있는 일이 많지 않다고 생각한다. XML을 파이썬으로 변환하는 것이 아마도 병목 일 것이다.

+0

어떻게 이것을 병렬로 수행 할 수 있습니까? –

+0

'asyncio'를 사용하여 공동 루틴을 작성해야합니다. 하나의 공동 루틴은 단순히 워크 시트를 산출합니다. –