Python 将大型Excel文件转换为CSV
在我的应用程序中,从繁重的csv文件中获取数据并上传到dataabse,我还需要从excel文件中导入数据。为此,我首先使用Python 将大型Excel文件转换为CSV,python,excel,csv,openpyxl,xlrd,Python,Excel,Csv,Openpyxl,Xlrd,在我的应用程序中,从繁重的csv文件中获取数据并上传到dataabse,我还需要从excel文件中导入数据。为此,我首先使用xlrd将excel文件转换为csv,这对小文件非常有效,但在转换大文件时却花费了大量时间。当我给一个6张纸的文件,每一行1米时,我等待了40分钟才终止这个过程,因为等待的时间太长了 目前,我正在使用openmyxl库将excel文件转换为csv,该库的速度明显快于xlrd,尤其是在只读模式下,但遗憾的是,即使是转换重文件的8-10分钟延迟也太多 Python中是否有任何节
xlrd
将excel文件转换为csv,这对小文件非常有效,但在转换大文件时却花费了大量时间。当我给一个6张纸的文件,每一行1米时,我等待了40分钟才终止这个过程,因为等待的时间太长了
目前,我正在使用openmyxl
库将excel文件转换为csv,该库的速度明显快于xlrd
,尤其是在只读模式下,但遗憾的是,即使是转换重文件的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
在只读模式下,您应该能够并行读取工作表和写入CSV。除此之外,我认为没有什么可以做的:将XML转换为Python可能是瓶颈。使用只读模式,您应该能够并行地读取工作表和编写CSV。除此之外,我认为没有什么可以做的:将XML转换为Python可能是瓶颈。尝试使用pandas
。您还将得到一个更短的代码:import pandas as pd;df=pd.read_excel('/path/to/excel.xlsx');df.to_csv('/path/to/csv_file.csv')
@DeepSpace由于熊猫在内部使用xlrd读取文件并将行转换为列,这不是一个好主意。所以我尝试了这个方法。原来pandas
甚至比openpyxl
还要慢。一个6页(每行10万行)的文件已经有7分钟多了,而且还在计数。浏览熊猫只会占用更多的内存。xlrd实际上比openpyxl占用的内存更少,但正如您所看到的,它在开始之前会读取整个工作簿。请尝试使用pandas
。您还将得到一个更短的代码:import pandas as pd;df=pd.read_excel('/path/to/excel.xlsx');df.to_csv('/path/to/csv_file.csv')
@DeepSpace由于熊猫在内部使用xlrd读取文件并将行转换为列,这不是一个好主意。所以我尝试了这个方法。原来pandas
甚至比openpyxl
还要慢。一个6页(每行10万行)的文件已经有7分钟多了,而且还在计数。浏览熊猫只会占用更多的内存。xlrd实际上比openpyxl占用的内存更少,但正如您所看到的,它在开始之前会读取整个工作簿。如何并行执行此操作?您需要使用asyncio
编写协同例程,一个协同例程只会生成工作表。如何并行执行此操作?您需要使用asyncio
编写协同例程共同例程只生成工作表。