【问题标题】:Loop in order to create several DataFrames for each sheet in an Excel file循环以便为 Excel 文件中的每个工作表创建多个 DataFrame
【发布时间】:2020-02-28 21:21:32
【问题描述】:

我有一个 36 张的 Excel 文件。我想遍历 Excel 文件的每个工作表并为文件中的每个工作表创建一个 DataFrame。 另外,我希望 DataFrames 以工作表的名称命名。 我是 python 的新手,在这个网站上,我看到这个问题有一个类似的主题,但它并没有完全回答我的问题。

这是我到目前为止写的 for 循环,但它并没有按照我的想法做。 通过此代码的最后一条记录,我获得了一个名为 sheet1 的数据框,其中最后一个数据位于 excel 文件的最后一张表中。 我想获得的是在 excel 中为每个工作表有 36 个不同的数据框,如果可能,每个数据框必须用每个电子表格的名称命名(我认为名为“dict_of_sheet”的字典包含所有 36 个表我想从excel上传python。

你能帮我解决这个问题吗?

非常感谢。

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]

【问题讨论】:

  • df = pd.read_excel(your_file,sheet_name=None) 将数据帧作为有序 dict 读取,键作为工作表名称

标签: python pandas


【解决方案1】:

您可以为此使用exec()exec()函数用于Python程序的动态执行,可以是字符串也可以是目标代码。

您也可以使用 xlrd 库来获取工作表名称。您也可以使用 pandas 库作为工作表名称(我没有环顾四周,肯定有办法做到这一点)。

import xlrd

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

print(sheet_names)

输出:

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

现在您已经有了工作表名称,您现在可以对它们运行循环并使用 exec 创建同名的数据框:

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

这会创建文件名为 see1、see2 和 Sheet3 的数据框。

print(see1)

输出:

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

希望这是你需要的。

注意:如果您的工作表名称只是数字,则无法将变量仅命名为数字,因此您可能必须为其指定一个新名称。

所以仅针对 OP 的情况,这里有一个解决方案:

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}')")

因此,这段代码的作用是,如果您有任何只是数字的工作表名称,它将创建变量名称为 Sheet_name{the numeric}。

所以在我的例子中,我的工作表名称为:['Sheet1', '245', 'Sheet3'],我最终将第二个变量作为数据框获得,如下所示:

print(Sheet_name245)

输出:

   Col1  Col2
0     1     4
1     2     5
2     3     6

希望这对您的案件有所帮助。

NOTE2:如果工作表名称中包含小数,而不仅仅是整数作为数字,则上述代码将停止,因为 十进制也不能用于变量名。所以这里有一个 解决方法:

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。我希望现在您的问题已得到解决。

【讨论】:

  • Error for loop for name in sheet_names: If I run the following loop, Ill 获得此错误 exec(f"{name}=pd.read_excel('{filename}', sheet_name='{name}')")` SyntaxError: can '不分配给文字(,第 1 行) Traceback(最近一次调用最后):文件“C:\\anaconda3\lib\sitepackages\IPython\core\interactiveshell.py”,第 3326 行,在 run_code exec(code_obj , self.user_global_ns, self.user_ns) 文件“”,第 2 行,在 中 exec(f"{name}=pd.read_excel('{filename}', sheet_name=' {name}')") 文件“”,第 1 行语法错误:无法分配给文字
  • 您使用的是哪个 Python 版本,您使用的是什么操作系统?你能给我更新吗?
  • 我能想到的另一个问题是,您的工作表名称本身就是一个数字。所以,在Python中,不能做到1=14,1不被识别为变量名,甚至一个字符串也不被识别为变量名。我的意思是你不能有,'sheet1'=45,它可以只是一个简单的变量名,sheet1=45。这只是一个猜测。你能检查一下你得到了什么作为你的工作表名称,它们的类型是什么?它们是字符串还是整数?
  • 我在原始答案中添加了解决您问题的方法,您可以使用它,它肯定可以解决您的问题。
  • 非常感谢您对@AmitAmola 的支持。是的,工作表的名称是数字。所以我发现了你提到的问题。无论如何,循环在 excel 的第四张表处停止,因为第五张(和其他)在名称内有一个点。后续工作表的名称是 4.5 ; 4.7等。我试图修改上面的代码,以考虑这种情况,但没有奏效。 if name.isdigit() or isinstance(name,float): exec(f"Sheet_name{name}=pd.read_excel('{filename}', sheet_name='{name}')")
猜你喜欢
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 2014-03-22
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多