Как зациклить списки списков, полученных из python-docx, где каждый список является таблицей, и записать таблицы в отдельные таблицы - PullRequest
0 голосов
/ 03 января 2019

Я использую python-docx для извлечения двух таблиц из документа. Я перебрал таблицы и создал список списков. Каждый отдельный список представляет таблицу, и в ней у меня есть словари для каждой строки. Каждый словарь содержит пару ключ / значение. Ключ - это заголовок столбца таблицы, а значение - содержимое ячейки для данных этой строки для этого столбца. Я сталкиваюсь с трудностями при создании фрейма данных для каждой таблицы и написании каждой таблицы на отдельном листе Excel.

from docx.api import Document
import pandas as pd
import csv
import json
import unicodedata

document = Document('Sampletable1.docx')
tables = document.tables
print (len(tables))
big_data = []


for table in document.tables:
    data = []
    Keys = None
    for i, row in enumerate(table.rows):
        text = (cell.text for cell in row.cells)
        if i == 0:
            keys = tuple(text)
            continue
        dic = dict(zip(keys, text))
        data.append(dic)
    big_data.append(data)
 print(big_data)

Вывод вышеуказанного кода:

2

[[{'Актив': 'Инвестиции в рост', 'Целевая совокупность инвестиций': '66 .50% ',' Фактическая совокупность инвестиций ': '66 .30%', 'Разница': '-0.20%'}, {' Актив ':' Оборонительные инвестиции ',' Целевое сочетание инвестиций ': '33 .50%', 'Фактическое сочетание инвестиций': '33 .70% ',' Разница ':' 0.20% '}], [{' Владелец ':' REST Super ',' Product ':' Superannuation ',' Type ':' Existing ',' Status ':' Existing ',' Customer 2 ':' Customer 1 '}, {' Owner ':' TWUSUPER TransPension ',' Product ' : «TTR Pension», «Type»: «New», «Status»: «New», «Customer 2»: «Customer 1»}, {«Owner»: «TWUSUPER», «Product»: «Superannuation», 'Type': 'Existing', 'Status': 'Existing'}]]

Как получить доступ к вышеперечисленным спискам ??

Далее я попытался создать фрейм данных для панд

#write the data into a data frame
for thing in big_data:
    #print(thing)
    df = pd.DataFrame(thing)
    print(df)
    writer = pd.ExcelWriter('dftable3.xlsx', engine='xlsxwriter')
    df.to_excel(writer, sheet_name='Sheet1')
    writer.save()

Я получил первую таблицу в Excel, но не смог работать со второй таблицей. Я ожидаю, что обе таблицы будут находиться в одной и той же книге Excel (dftable3.xlsx), но в разных таблицах (Sheet1, Sheet2)

Я приложил изображения таблиц.

Заранее спасибо

enter image description hereenter image description here

1 Ответ

0 голосов
/ 03 января 2019

Как получить доступ к вышеуказанным спискам ??

Вы уже сделали, перебирая их или печатая их. Подумайте об использовании библиотеки pretty-print:

import pprint
pprint.pprint(big_data)

Я ожидаю ... разные листы (Лист1, Лист2)

Ну, это маловероятно, учитывая заданный вами аргумент константы Sheet1. Вот один из способов сделать это:

writer = pd.ExcelWriter('dftable3.xlsx', engine='xlsxwriter')
for i, thing in enumerate(big_data):
    df = pd.DataFrame(thing)
    df.to_excel(writer, sheet_name=f'Sheet{i}')
writer.save()

Обратите внимание на область действия writer - она ​​должна быть дольше, чем каждая из составляющих df с.

...