【问题标题】:How to compile multiple excel files in numeric order (file1.xls, file2.xls, etc) into one python file?如何按数字顺序(file1.xls、file2.xls等)将多个excel文件编译成一个python文件?
【发布时间】:2019-07-10 15:11:07
【问题描述】:

我正在尝试一起编译几个 .xls 文件。我发现了一些有效的代码,但它把文件乱序放置。这些文件的名称为 therm_sensor1.xls、therm_sensor2.xls 等。我需要按数字顺序输出,但我当前的代码似乎将它们打乱了。我对计算机编码很陌生,所以解释会很有帮助:) 此外,我当前的输出包含除前 6 行之外的所有数据。我不知道它为什么这样做。

import pandas as pd
import glob

glob.glob('therm_sensor*.xls')

all_data = pd.DataFrame()
for f in glob.glob('therm_sensor*.xls'):
    df = pd.read_excel(f)
    all_data = all_data.append(df, ignore_index=True)

print(all_data.to_string())

输出:

6    1.739592e-05  0.30           NaN

7    2.024840e-05  0.35           NaN

8    2.309999e-05  0.40           NaN

...

502  2.949562e-10  0.95           NaN

503  3.113220e-10  1.00           NaN

【问题讨论】:

  • Python 的 for 循环依赖于迭代器模式。如果你理解迭代器(glob.glob('therm_sensors*.xls")),你就会理解程序流程。
  • 您可以尝试循环打开文件,而不是 glob - 例如对于i in range(1,10)(范围始终是一个范围,按顺序排列),然后循环中的文件名是'therm_sensor{}.xls'.format(i)

标签: python excel pandas glob


【解决方案1】:

我有类似的问题,最终,我想出了一个办法。所以我会给你一个对我有用的解决方案。我做的一件事是在传递给数据框之前命名列名。看看这是否有帮助。

fileList=glob.glob("*.csv")
    dfList=[]
    colnames=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34]
    for filename in fileList:
        print(filename)
        df=pd.read_csv(filename, header=None)
        dfList.append(df)
    concatDf=pd.concat(dfList, axis=0)
    concatDf.columns=colnames
    #concatDf.to_csv(outfile, index=None) -# You dont need this. 
concatenate()

【讨论】:

    【解决方案2】:

    这里的问题(可能)是由于人类和计算机倾向于对事物进行分类的方式不同。列一个这样的列表:

    files = ['file10.xls', 'file2.xls', 'file1.xls']
    

    计算机以一种人类看起来不直观的方式对这个列表进行排序(因为它是 1102):

    >>> sorted(files)
    ['file1.xls', 'file10.xls', 'file2.xls']
    

    但是,如果您更改排序标准,您可以获得更直观的结果。在这里,这意味着隔离文件名中包含数字的部分并将其转换为整数,以便计算机可以正确排序:

    >>> sorted(files, key=lambda s: int(s[4:-4]))
    ['file1.xls', 'file2.xls', 'file10.xls']
    

    在您的用例中,这应该可以解决问题:

    sorted(glob.glob('therm_sensor*.xls'), key=lambda s: int(s[12:-4]))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多