如何在Python中快速将xlsx文件转换为csv文件?

5
我有一个大小为140MB的Excel文件,需要使用pandas进行分析。问题在于,如果我将此文件作为xlsx打开,Python仅仅读取该文件就需要5分钟的时间。我尝试手动将该文件保存为csv格式,然后Python只需要大约1秒钟的时间来打开和读取它!有不同的2012-2014解决方案,因此Python 3在我的环境中并不真正起作用。
有人能建议如何快速将文件'C:\master_file.xlsx'转换为'C:\master_file.csv'吗?

https://github.com/dilshod/xlsx2csv? - plasmon360
4个回答

4

有一个旨在处理数据时非常符合Python风格的项目叫做“rows”。其中,对于xlsx格式数据,它使用了“openpyxl”。虽然我不知道这是否比Pandas更快,但无论如何:

$ pip install rows openpyxl

并且:

import rows
data = rows.import_from_xlsx("my_file.xlsx")
rows.export_to_csv(data, open("my_file.csv", "wb"))

将所有内容加载到内存中并不是一个明智的选择,但由于您选择了LGPL许可证,我无法进行代码审查。 - Charlie Clark
2
抱歉,如果这违背了你的宗教信仰或其他原因,你就不能“审查LGPL代码”。法律上没有任何阻止你审查LGPL或贡献LGPL代码的规定,这只是纯粹的恐吓。LGPL要求你的是,如果你在私人项目中使用该软件并对其进行修改(不包括链接部分,只是软件本身),你必须发布你的修改。在GitHub上进行“代码审查”已经是“发布”了,所以LGPL没有任何区别。话虽如此,该项目不是我的。 - jsbueno
1
是的,这违背了我的信仰。 - Charlie Clark

3
我遇到了和你一样的问题。Pandas和openpyxl对我无效。
我找到了这个解决方案,对我很有用:
import win32com.client
xl=win32com.client.Dispatch("Excel.Application")
xl.DisplayAlerts = False
xl.Workbooks.Open(Filename=your_file_path,ReadOnly=1)
wb = xl.Workbooks(1)
wb.SaveAs(Filename='new_file.csv', FileFormat='6') #6 means csv
wb.Close(False)
xl.Application.Quit()
wb=None
xl=None

这里您可以通过Excel将文件转换为CSV格式。我尝试了其他方式都无法起作用。


2

在openpyxl中使用只读模式。类似以下内容应该可以工作。

import csv
import openpyxl

wb = load_workbook("myfile.xlsx", read_only=True)
ws = wb['sheetname']
with open("myfile.csv", "wb") as out:
    writer = csv.writer(out)
    for row in ws:
        values = (cell.value for cell in row)
        writer.writerow(values)

你是否相应地更改了示例中的“sheetname”,并且指向了有效的工作表?(请注意,这种详细说明和解决方法正是“行”旨在消除的方式) - jsbueno
wb = load_workbook("c:\heavy_file2017-12-08.xlsx", read_only=True) ws = wb['Vol_Summary'] with open("c:\heavy_file2017-12-08.csv", "wb") as out: writer = csv.writer(out) for row in ws: values = (cell.value for cell in row) writer.writerow(values) - Andrea
我认为问题可能在于xlsx文件中的数据位于单元格D15-BB30,因此第一行和左侧列为空。这可能是问题所在吗? - Andrea
我可以告诉你,在循环中加入了打印语句,但是没有任何输出。这意味着它没有遍历行。 - Andrea
如果我在 ws = wb ['sheetname'] 之后添加 print('\n max row:',ws.max_row),它会显示1... - Andrea
显示剩余7条评论

1
最快的方法是想到的:
  1. pandas.read_excel
  2. pandas.DataFrame.to_csv
作为额外的好处,您将能够在保存数据到csv之前对数据进行清理。
import pandas as pd
df = pd.read_excel('C:\master_file.xlsx', header=0) #, sheetname='<your sheet>'
df.to_csv('C:\master_file.csv', index=False, quotechar="'")

在某些时候,处理大量数据需要花费大量时间。这只是生活的一个事实。如果这是一个问题,寻找解决方案是很好的选择。


2
谢谢你的回答,非常感激。不幸的是,我目前正在做的就是这样,但 pd.read_excel 太慢了。 - Andrea
你的系统规格是什么?你从哪里获取数据(硬盘驱动器,固态硬盘,网络文件系统等)?你的数据集中有多少行?在我的系统上,我回答中的代码大约能在5分钟内处理大约1000万条记录、1.17 GB的数据。因为你使用了相同的方法,如果我猜测的话,你的瓶颈可能不是Python代码本身。 - RagingRoosevelt
1
使用Pandas来做这个的问题在于,DataFrame是基于列的,而Excel和CSV都是基于行的。这意味着在进行转换之前,所有的值都必须加载到内存中,因此,Pandas不适用于这个任务。 - Charlie Clark
@CharlieClark 谢谢。在这种情况下,我不需要使用pandas。你认为有其他的Python解决方案可以执行转换吗? - Andrea
@RagingRoosevelt 谢谢 - 我有一个大小为140MB的批处理文件,文件内有6个工作表,每个工作表有8行和300列。我该如何检查还可能存在哪些瓶颈? - Andrea
@Andrea,特别是在那种设置下,我认为Charlie是正确的。但是,根据我的观察,每当你必须使用表格时,它真的会降低性能。 - RagingRoosevelt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接