有没有更快的方法将许多XLS文件附加到单个CSV文件中?

时间:2015-05-15 17:51:41

标签: python csv optimization pandas

Jeff's Answer推荐this Google Forum之后,我仍然对于关于appendCSV方法的结论感到满意。下面,您可以看到我读取许多XLS文件的实现。有没有办法显着提高这个速度?它目前需要超过10分钟,大约900,000行。

listOfFiles = glob.glob(file_location)
frame = pd.DataFrame()


for idx, a_file in enumerate(listOfFiles):
    data = pd.read_excel(a_file, sheetname=0, skiprows=range(1,2), header=1)
    data.rename(columns={'Alphabeta':'AlphaBeta'}, inplace=True)

    frame = frame.append(data)

# Save to CSV..
frame.to_csv(output_dir, index=False, encoding='utf-8', date_format="%Y-%m-%d")

2 个答案:

答案 0 :(得分:1)

第一个重点

仅优化需要优化的代码

如果您只需要将所有文件转换一次,那么您已经做得很好,恭喜!但是,如果您需要经常重复使用它 (并且真的我的意思是有一个源生成您的Excel文件,其速度至少为每行900K行10分钟,您需要实时解析它们,然后您需要做的是分析您的分析结果。

分析分析

按照' cumtime '降序对您的个人资料进行排序,这是函数的累积执行时间,包括其子句,你会发现它大约2000秒的运行时间〜800秒由' read_excel'方法和~1200秒由' to_csv'方法

如果那时您将按' tottime '对个人资料进行排序这是函数本身的总执行时间,你会发现最常见的消费者填充了与读写线和格式之间的转换相关的功能。所以,真正的问题是你使用的库很慢,或者你解析的数据量实际上是巨大的

可能的解决方案

出于第一个原因,请记住解析Excel行并转换它们可能是一项非常复杂的任务。如果没有输入数据的示例,很难建议您。但是可能会有一个实时的损失,因为您使用的库是所有,并且当您实际上不需要它时,它会很难解析几行,因为您的行具有非常简单的结构。在这种情况下,您可能会尝试切换到不执行复杂的输入数据解析的库,例如使用 xlrd 从Excel读取数据。但是在标题中你提到输入文件也是CSV,所以如果这适用于你的情况,那么只需加载行:

line.strip().split(sep)

而不是复杂的Excel格式解析。当然,如果你的行很简单,你可以随时使用

','.join(list_of_rows)

编写CSV而不是使用复杂的DataFrame。但是,如果您的文件包含Unicode符号,复杂字段等,那么这些库可能是最佳选择。

由于第二个原因 - 900K行可能包含900K到无限字节,因此很难理解您的数据输入是否真的如此之大,再次没有示例。如果你真的有很多数据,那么你可能做的并不多,你只需要等待。请记住,磁盘实际上是一个非常慢的设备。通常的磁盘可以为您提供最佳的~100Mb / s,因此如果您正在复制(因为最终这就是您正在做的事情)10Gb数据,那么您可以看到只需要至少3-4分钟即可实际读取原始数据数据并写出结果。但是如果您没有使用100%的磁盘带宽(例如,如果使用您正在使用的库解析一行需要与磁盘读取此行相当的时间),您可能还会尝试通过异步来提高代码的速度使用多处理map_async 而不是循环来读取数据。

答案 1 :(得分:0)

如果您使用的是熊猫,则可以执行以下操作:

dfs = [pd.read_excel(path.join(dir, name), sep='\t', encoding='cp1252', error_bad_lines=False ) for name in os.listdir(dir) if name.endswith(suffix)]
df = pd.concat(dfs, axis=0, ignore_index=True)

与其他将数据导入大熊猫的方法相比,这真是令人震惊。其他提示:

  • 您还可以通过为所有列指定dtype来加快速度。
  • 如果您要执行read_csv,请使用engine ='c'加快导入速度。
  • 跳过错误行