当Excel表格从可变行开始时,如何使用Pandas读取?

4

我有一个包含多个工作表的Excel工作簿。 我正在尝试使用Pandas read_excel()迭代地从每个工作表读取DataFrame,以便为每个工作表输出单独的csv文件。

def getSheets(inputfile, fileformat):
'''Split the sheets in the workbook into seperate CSV files in to folder
    in the directory. CSV's are named identical to the original sheet names'''
name = getName(inputfile) # get name
try:
    os.makedirs(name)
except:
    pass
# read as df
df1 = pd.ExcelFile(inputfile)
# for each sheet create new file
for x in df1.sheet_names:
    y = x.lower().replace("-", "_").replace(" ","_")
    print(x + '.' + fileformat, 'Done!')
    df2 = pd.read_excel(inputfile, sheet_name=x) #looking for way to dynamically find where the table begins
    filename = os.path.join(name, y + '.' + fileformat)
    if fileformat == 'csv':
        df2.to_csv(filename, index=False)
    else:
        df2.to_excel(filename, index=False)

我遇到的问题是Excel工作簿有很多格式。结果是每个表格在每个工作表上都从不同的行开始。以下是工作簿中一个工作表的示例:示例表格 在这里,表格从第10行开始。在同一工作簿的其他工作表中,该表格从第8行开始等等。有50多个工作表,表格的第一行在各处不同。
我已经了解了使用“skiprows”参数读取特定行的方法。但是该参数的值在迭代每个工作表时会发生变化。有没有一种使用Pandas读取表格的方法,即使每个表格都从可变行开始,或者有没有一种方法可以确定表格实际开始的位置?

如果您的表格具有易于测试的某些行为,那么这并不是真正的答案,但您可以阅读所有内容并跳过前几行。 - Felício
1个回答

0

在调用pd.read_excel(或其近亲ExcelFile.parse)之前,您可以通过手动阅读Excel文件来找到表格的起始位置:

frames = []

xl = pd.ExcelFile('data.xlsx')
for sheet in xl.book.sheets():
    # Find where a table begins within the first 200 rows of the sheet
    found = False
    for n in range(200):
        if sheet.cell_value(n, 0) == 'ID':
            found = True
            break
    if not found:
        raise ValueError('Cannot find the table')
    
    # Read the table
    frames.append(xl.parse(sheet.name, skiprows=n))

谢谢您。不幸的是,第一列名称也是可变的,并且每个工作表都会更改。因此,“如果sheet.cell_value(n,0)== 'ID':'”将无法适用于那些没有将第一列命名为“ID”的工作表。是否有一种方法可以在初始for循环之前检查第一列名称? - MP0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接