XLRD не может прочитать имя многоиндексного столбца - PullRequest
0 голосов
/ 17 октября 2019

У меня проблема с именем многоиндексного столбца. Я использую XLRD для преобразования данных Excel в JSON, используя json.dumps, но вместо этого он дает мне только одну строку имени столбца. Я читал о многоуровневой JSON, но я не знаю, как это сделать с помощью XLRD.

Вот мой пример имени столбца таблицы

Пример кода:

for i in path:
with xlrd.open_workbook(i) as wb:
    print([i])
    kwd = 'sage'
    print(wb.sheet_names())
    for j in range(wb.nsheets):
        worksheet = wb.sheet_by_index(j)
        data = []
        n = 0
        nn = 0
        keyword = 'sage'
        keyword2 = 'adm'
        try:
            skip = skip_row(worksheet, n, keyword)
            keys = [v.value for v in worksheet.row(skip)]
        except:
            try:
                skip = skip_row2(worksheet, nn, keyword2)
                keys = [v.value for v in worksheet.row(skip)]
            except:
                continue
        print(keys)
        for row_number in range(check_skip(skip), worksheet.nrows):
            if row_number == 0:
                continue
            row_data = {}
            for col_number, cell in enumerate(worksheet.row(row_number)):

                row_data[keys[col_number]] = cell.value
            data.append(row_data)
        print(json.dumps({'Data': data}))

кстати, каждый лист имеет свой номерпропустить перед именем столбца, поэтому мой код получил функцию пропуска строки. После того, как я пропустил строку и нашел точное местоположение моего столбца имя. Затем я начинаю читать значения. Но это да, где проблема возникает с моей точки зрения, потому что я получил две строки имени столбца. И все еще путают, как сделать многоуровневый JSON с XLRD или хотя бы объединить имя столбца с XLRD (что, я думаю, не может).

Желаемый результат многоуровневый JSON:

{ "Data":[{ "ID" : "997", "Tax" : [{"Date" : "9/7/2019", "Total" : 2300, "Grand Total" : 340000"}], "Tax ID" : "ST-000", .... }]}

pss: // Я пытался использовать панд, но это доставляет мне много хлопот, так как я работаю с большими данными.

1 Ответ

0 голосов
/ 17 октября 2019

Вы можете использовать мультииндексирование в panda, сначала вам нужно получить индекс строки заголовка для каждого листа.

header_indexes = get_header_indexes(excel_filepath, sheet_index) #returns list of header indexes

Вам необходимо написать get_header_indexes функцию, которая сканирует листы и возвращает индексы заголовков.

Вы можете использовать panda для получения JSON из фрейма данных.

import pandas as pd
df = pd.read_excel(excel_filepath, header=header_indexes, sheet_name=sheet_index)
data = df.to_dict(orient="records")

для нескольких заголовков data содержит список dict, и у каждого dict есть кортеж в качестве ключа, вы можете переформатировать его в окончательный JSON согласно вашему требованию.

Примечание: Используйте chunksize для чтения больших файлов.

...