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

Python 有没有更快的方法将多个XLS文件附加到单个CSV文件中?,python,csv,optimization,pandas,Python,Csv,Optimization,Pandas,在收到来自的建议后,我仍然对appendCSV方法的结论不满意。下面,您可以看到我读取许多XLS文件的实现。有没有办法显著提高这一速度?目前大约90万行需要10分钟 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

在收到来自的建议后,我仍然对appendCSV方法的结论不满意。下面,您可以看到我读取许多XLS文件的实现。有没有办法显著提高这一速度?目前大约90万行需要10分钟

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")
第一点很重要 只优化需要优化的代码

如果您只需要转换一次所有文件,那么您已经完成了一项伟大的工作,恭喜!但是,如果您需要经常重用它(我的意思是,有一个源以每10分钟至少900K行的速度生成Excel文件,并且您需要实时解析它们),那么您需要做的是分析分析分析结果

剖面分析 通过“cumtime”按降序排序您的配置文件,这是函数(包括其子类)的累计执行时间,您会发现在运行时间约2000秒中,约800秒由“read_excel”方法占用,约1200秒由“to_csv”方法占用

然后,如果您按照“tottime”对配置文件进行排序,这是函数本身的总执行时间,您将发现顶级时间使用者使用的函数与读写行以及格式之间的转换有关。所以,真正的问题是,要么使用的库速度慢,要么解析的数据量非常大

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

line.strip().split(sep)
而不是复杂的Excel格式解析。当然,如果您的行很简单,那么您可以随时使用它

','.join(list_of_rows)
编写CSV而不是使用复杂的数据帧。但是,如果您的文件包含Unicode符号、复杂字段等,那么这些库可能是最佳选择


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

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

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来加快速度
  • 如果您正在执行读取csv,请使用engine='c'加速导入
  • 错误时跳过行

您可以尝试进行分析以检查瓶颈在哪里。立即尝试的一件事是构建
数据列表,而不是每次重新结束帧。下面,添加
数据=[]
datas.append(data)
然后
frame=pd.concat(datas)
或在适当的位置添加,然后删除append。这将帮助您找出是否是重复的附录,但您也应该计算read_excel本身的时间(删除所有其他内容,看看需要多长时间)。google甚至stack overflow中有几个链接是分析的好起点:@Ivan I分析了DSM建议的内容:是输出吗抱歉,我看不到附件。你能发前5行吗?否则,Dimitri的建议是一个良好的开端。