【问题标题】:Possible to loop through excel files with differently named sheets, and import into a list?可以遍历具有不同名称工作表的 excel 文件并导入列表吗?
【发布时间】:2019-01-07 07:31:33
【问题描述】:

我没有可重复的示例,但基于兴趣询问。

通过R中的循环函数,我们可以使用以下代码从目录中获取所有.csv:

file.list <- list.files(pattern='*.csv') #obtained name of all the files in directory
df.list <- lapply(file.list, read.csv) #list

我们是否可以循环使用 .xlsx 文件而不是不同数量的工作表的目录?

例如:A.xlsx 包含 3 张工作表,Jan01、Sheet2 和 Sheet3; B.xlsx 包含 3 张工作表,Jan02、Sheet2 和 Sheet3 ... 等等。第一个工作表名称更改。

是否可以遍历目录并仅获取所有 excel 文件中第一张工作表的数据框?

欢迎使用 Python 或 R 代码!

谢谢!

【问题讨论】:

    标签: python r


    【解决方案1】:

    在 R 中

    这是使用包openxlsxR 解决方案

    # get all xlsx files in given directory
    filesList <- list.files("d:/Test/", pattern = '.*\\.xlsx', full.names = TRUE)
    
    # pre-allocate list of first sheet names
    firstSheetList <- rep(list(NA),length(filesList))
    
    # loop through files and get the data of first sheets
    for (k in seq_along(filesList)) 
      firstSheetList[[k]] <- openxlsx::read.xlsx(filesList[k], sheet = 1)
    

    【讨论】:

      【解决方案2】:

      使用readxl-package 的另一种(快速)R 解决方案

      l <- lapply( file.list, readxl::read_excel, sheet = 1 )
      

      【讨论】:

        【解决方案3】:

        当然,可以使用pandaspython

        import pandas as pd
        
        excel_file = pd.ExcelFile('A.xlsx')
        dataframes = {sheet: excel_file.parse(sheet) for sheet in excel_file.sheet_names}
        

        dataframes 成为一个字典,键是工作表的名称,值成为包含工作表数据的数据框。您可以像这样遍历它们:

        for k,v in dataframes.items():
            print('Sheetname: %s' % k)
            print(v.head())
        

        【讨论】:

          【解决方案4】:

          通过使用Openpyxl

          get_sheet_names()

          此函数返回工作簿中工作表的名称,您可以计算名称以了解当前工作簿中的工作表总数。代码将是:

          >>> wb=openpyxl.load_workbook('testfile.xlsx')
          >>> wb.get_sheet_names()
          ['S1, 'S2', 'S3']
          

          我们可以一次访问任何工作表。假设我们要访问 Sheet3。应编写以下代码

          >>> import openpyxl
          >>> wb=openpyxl.load_workbook('testfile.xlsx')
          >>> wb.get_sheet_names()
          ['Sheet1', 'Sheet2', 'Sheet3']
          >>> sheet=wb.get_sheet_by_name('Sheet3')
          

          函数get_sheet_by_name('Sheet3') 用于访问特定工作表。此函数将工作表的名称作为参数并返回一个工作表对象。我们将其存储在一个变量中,并且可以像...一样使用它

          >>> sheet
          <Worksheet "Sheet3">
          >>> type(sheet)
          <class 'openpyxl.worksheet.worksheet.Worksheet'>
          >>> sheet.title
          'Sheet3'
          >>> 
          

          最终:

          worksheet = workbook.get_sheet_by_name('Sheet3')    
          for row_cells in worksheet.iter_rows():
              for cell in row_cells:
                 print('%s: cell.value=%s' % (cell, cell.value) )
          

          【讨论】:

            【解决方案5】:

            为简单起见,假设我们有两个工作簿,其中第一个工作表采用这种格式:

            您可以使用glob.glob() 遍历目录中的每个.xlsx 文件,并将带有pandas.ExcelFile.parse() 的第一张工作表的数据框附加到列表中:

            from glob import glob
            import pandas as pd
            
            sheets = []
            
            # Go through each xlsx file
            for xlsx_file in glob("*.xlsx"):
            
                # Convert sheet to dataframe
                xlsx = pd.ExcelFile(xlsx_file)
            
                # Get first sheet and append it
                sheet_1 = xlsx.parse(0)
                sheets.append(sheet_1)
            
            print(sheets)
            

            打印列表中包含的两个数据帧:

            [   x  y
            0  1  2
            1  1  2,    x  y
            0  1  2
            1  1  2]
            

            您也可以将以上内容写成列表推导式

            [pd.ExcelFile(xlsx_file).parse(0) for xlsx_file in glob("*.xlsx")]
            

            您还可以将数据帧存储到以文件名为键的字典中:

            {xlsx_file: pd.ExcelFile(xlsx_file).parse(0) for xlsx_file in glob("*.xlsx")}
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-01-19
              • 2017-12-19
              • 1970-01-01
              • 2017-12-26
              • 1970-01-01
              • 2013-08-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多