Je n'ai pas d'exemple reproductible pour cela, mais je le demande en fonction de l'intérêt.
Avec une fonction de boucle dans R, nous pouvons obtenir tous les .csv d'un répertoire avec le code ci-dessous:
file.list <- list.files(pattern='*.csv') #obtained name of all the files in directory df.list <- lapply(file.list, read.csv) #list
Serait-il possible pour nous de faire une boucle un répertoire avec des fichiers .xlsx à la place avec un nombre différent de feuilles?
Par exemple: A.xlsx contient 3 feuilles, Jan01, Sheet2 et Sheet3; B.xlsx contient 3 feuilles, Jan02, Sheet2 et Sheet3 ... et ainsi de suite. Le nom de la première feuille change.
Est-il possible de parcourir un répertoire et d'obtenir simplement les dataframes de la première feuille dans tous les fichiers Excel?
Les codes Python ou R sont les bienvenus!
Merci!
5 Réponses :
Bien sûr, c'est possible en utilisant pandas et python .
for k,v in dataframes.items():
print('Sheetname: %s' % k)
print(v.head())
dataframes devient un dictionnaire, les clés étant les noms des feuilles, et les valeurs devenant le dataframe contenant les données de la feuille. Vous pouvez les parcourir comme ceci:
import pandas as pd
excel_file = pd.ExcelFile('A.xlsx')
dataframes = {sheet: excel_file.parse(sheet) for sheet in excel_file.sheet_names}
En utilisant Openpyxl
get_sheet_names () .
Cette fonction renvoie les noms des feuilles dans un classeur et vous pouvez compter les noms pour indiquer le nombre total de feuilles dans le classeur actuel. Le code sera:
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) )
nous pouvons accéder à n'importe quelle feuille à la fois. Supposons que nous voulions accéder à Sheet3. Le code suivant doit être écrit
>>> sheet <Worksheet "Sheet3"> >>> type(sheet) <class 'openpyxl.worksheet.worksheet.Worksheet'> >>> sheet.title 'Sheet3' >>>
La fonction get_sheet_by_name ('Sheet3') est utilisée pour accéder à une feuille particulière. Cette fonction prend le nom de la feuille comme argument et renvoie un objet feuille. Nous stockons cela dans une variable et pouvons l'utiliser comme ...
>>> import openpyxl
>>> wb=openpyxl.load_workbook('testfile.xlsx')
>>> wb.get_sheet_names()
['Sheet1', 'Sheet2', 'Sheet3']
>>> sheet=wb.get_sheet_by_name('Sheet3')
et éventuellement:
>>> wb=openpyxl.load_workbook('testfile.xlsx')
>>> wb.get_sheet_names()
['S1, 'S2', 'S3']
Pour simplifier, disons que nous avions deux classeurs avec la première feuille dans ce format:
Vous pouvez parcourir chaque .xlsx dans le répertoire avec glob. glob () , et ajoutez le dataframe de la première feuille avec pandas.ExcelFile.parse () dans une liste:
{xlsx_file: pd.ExcelFile(xlsx_file).parse(0) for xlsx_file in glob("*.xlsx")}
Qui imprime deux dataframes contenu dans une liste:
[pd.ExcelFile(xlsx_file).parse(0) for xlsx_file in glob("*.xlsx")]
Vous pouvez également écrire ce qui précède sous forme de compréhension de liste :
[ x y 0 1 2 1 1 2, x y 0 1 2 1 1 2]
Vous pouvez également stocker les dataframes dans un dictionnaire avec les noms de fichiers comme clé:
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)
In R
Voici une solution R utilisant le package openxlsx
# 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)
une autre solution R (rapide) utilisant le readxl-package
l <- lapply( file.list, readxl::read_excel, sheet = 1 )