Existe-t-il un moyen de lire toutes les feuilles de fichiers xlsx, puis de tout abandonner pour acheter celle qui contient le plus de lignes?
Idéalement, je voudrais trouver la feuille qui contient littéralement le plus de DONNÉES, comme en taille en octets, mais les lignes fonctionneront pour le moment
J'aimerais aussi pouvoir le faire en chargeant, par exemple, la tête du fichier, pour que les temps de chargement soient moins longs, mais je peux utiliser .columns et len pour trouver quelle feuille a le plus de colonnes p>
3 Réponses :
Malheureusement, lire moins de lignes avec nrows = 1 par exemple ne semble pas réduire le temps de chargement initial. Le code suivant vous trouvera la feuille avec le plus grand nombre de lignes, puis l'enregistrera. Notez que si plus d'une feuille est liée pour le plus grand nombre de lignes, seule la dernière serait sauvegardée
read_in = pd.read_excel(items, sheet_name = None)
keys = []
for ijk in read_in.keys():
keys.append(ijk)
list_lens = []
for key in keys:
list_lens.append(len(read_in[key]))
counter = 0
for lengths in list_lens:
if lengths == max(list_lens):
if len(read_in[keys[counter]])>0:
writer = pd.ExcelWriter(filename, engine='xlsxwriter',options={'strings_to_urls': False})#this ensures you can save longer links that excel tries to make hyperlinks, you can skip it and provide the file name instead of writer below for most code
read_in[keys[counter]].to_excel(writer, index = False)
writer.close()#unnecessary if you just gave the file name in the line above instead of using the writer object
counter = counter +1
ce qui se passe ici, c'est que lire avec des feuilles = None les lit toutes, et crée un dictionnaire où les clés sont les noms de feuille et les valeurs sont les dataframes de la feuille entière. vous accédez ensuite à chaque dataframe, en vérifiant le nombre de colonnes. Ensuite, le code utilise ces informations pour enregistrer uniquement la trame de données accessible à l'aide de la clé qui se termine par le plus de colonnes
Lisez toutes les feuilles d'un fichier Excel et stockez-le dans un dictionary :
df = sheet_to_df_map.get(df_with_max_rows)
Maintenant, vous pouvez parcourir votre dictionnaire et créer un autre dictionnaire avec le nombre de lignes de dataframes comme ceci:
df_with_max_rows = max(row_count_dict, key=row_count_dict.get)
Ensuite, trouvez le max du row_count_dict par valeur:
row_count_dict = {}
for key,val in sheet_to_df_map.items():
row_count_dict[key] = val.shape[0]
Ensuite, recherchez le dict original avec cette clé pour obtenir le dataframe avec max_rows:
xls = pd.ExcelFile('excel_file_path.xls')
sheet_to_df_map = {}
for sheet_name in xls.sheet_names:
sheet_to_df_map[sheet_name] = xls.parse(sheet_name)
Ce sera votre dataframe final.
Celui-ci est très similaire à la réponse de Mayank, mais il devrait être légèrement plus rapide car il ne crée pas de dictionnaire et n'y stocke pas les dataframes analysés.
wb = pd.ExcelFile(r'path.xlsx')
max_row_count = 0
for sheet in wb.sheet_names:
parsed_sheet = wb.parse(sheet)
row_count = len(parsed_sheet)
if row_count>max_row_count:
max_row_count = row_count
df = parsed_sheet