L oop для создания нескольких фреймов данных для каждого листа в файле Excel - PullRequest
1 голос
/ 27 февраля 2020

У меня есть файл Excel с 36 листами. Я хотел бы перебрать каждый лист файла Excel и создать DataFrame для каждого листа в файле. Кроме того, я хотел бы, чтобы DataFrames были названы с именем листа. Я новичок ie в python, и на этом сайте я увидел, что для этого вопроса есть похожие топи c, но он не полностью отвечает на мой вопрос.

Это для l oop Я писал до сих пор, но он не делает то, что у меня на уме. С последней записью этого кода я получаю фрейм данных с именем sheet1 с последними данными внутри последнего листа в файле excel. То, что я хотел бы получить, - это иметь 36 разных фреймов данных для каждого листа в Excel, и, если возможно, каждый фрейм данных должен быть назван с именем каждой электронной таблицы (я думаю, что словарь "dict_of_sheet" содержит все 36 таблиц, которые Я хочу загрузить в python из Excel.

Не могли бы вы помочь мне решить эту проблему?

Большое спасибо.

multi_sheet_file = pd.ExcelFile("pathfile_Name")
excel_sheet_names = multi_sheet_file.sheet_names

dict_of_sheets = {}
for sheet in excel_sheet_names:
    dict_of_sheets[sheet] = pd.read_excel(multi_sheet_file, sheet_name=sheet)

sheet1=dict_of_sheets[sheet]

1 Ответ

0 голосов
/ 27 февраля 2020

Вы можете использовать для этого exec(). Функция exec() используется для динамического выполнения c программы Python, которая может быть либо строковым, либо объектным кодом.

Вы также можете использовать библиотеку xlrd для получения имен листов. Вы также можете использовать pandas libary для имен листов (я не оглядывался, определенно мог бы быть способ сделать это).

import xlrd

filename='try.xlsx'
xls = xlrd.open_workbook(filename, on_demand=True)
sheet_names=xls.sheet_names()

print(sheet_names)

Вывод:

['see1', 'see2', 'Sheet3']

Теперь, когда у вас есть имена листов, вы можете запустить l oop над ними и использовать exe c для создания фреймов данных с тем же именем:

for name in sheet_names:
    exec(f"{name}=pd.read_excel('{filename}', sheet_name='{name}')")

Это создает фреймы данных с именами файлов как see1 , см. 2 и Лист 3..

print(see1)

Вывод:

   Col1  COl2
0     1     2
1     2     3
2     3     4
3     4     4

Надеюсь, это то, что вам нужно.

ПРИМЕЧАНИЕ : В Если имя вашего листа - просто числа, тогда будет невозможно назвать переменную как просто число, поэтому вам, возможно, придется присвоить ей новое имя.

Так что просто для случая ОП Вот решение:

for name in sheet_names:
    if name.isdigit():
        exec(f"Sheet_name{name}=pd.read_excel('{filename}', sheet_name='{name}')")

    else:
        exec(f"{name}=pd.read_excel('{filename}', sheet_name='{name}')")

Так что этот код будет делать, если у вас есть любое имя листа, которое просто цифра c, он создаст имя переменной как, Sheet_name {числовое}.

Так что в моем случае у меня были имена листов как: ['Sheet1', '245', 'Sheet3'], и я наконец получил вторую переменную в качестве кадра данных, как показано ниже:

print(Sheet_name245)

Вывод:

   Col1  Col2
0     1     4
1     2     5
2     3     6

Надеюсь, это поможет в вашем случае.

ПРИМЕЧАНИЕ2: Случай, когда имя листа содержит десятичную дробь, а не только целое число как число, то приведенный выше код остановится, поскольку десятичное не может использоваться в имени переменной. Итак, вот обходной путь:

for name in sheet_names:
    if name.isdigit():
        exec(f"Sheet_name{name}=pd.read_excel('{filename}', sheet_name='{name}')")

    elif '.' in name:
        temp_name=name.replace('.', '_')
        exec(f"Sheet_name{temp_name}=pd.read_excel('{filename}', sheet_name='{name}')")        

    else:
        exec(f"{name}=pd.read_excel('{filename}', sheet_name='{name}')")

Итак, теперь мы получим имя файла для 245.63 как Sheet_name245_63. Я надеюсь, что теперь ваша проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...