2015-01-09 2 views
-1

Я хочу проанализировать таблицу из файла .docx с использованием Python и python-docx в какую-то полезную структуру данных.Анализ таблицы из файла .docx

Файл .docx содержит только одну таблицу в моем случае. У меня uploaded it so you can have a look. Вот скриншот:

Books.docx

+0

Почтовый код и соответствующие материалы здесь, а не на некоторых сайтах сторонних организаций, и особенно не с некоторым сокращенным URL-адресом на неизвестном веб-сайте. – CoryKramer

+0

Я пробовал много способов разобрать его, но не получил ничего, чтобы работать - так что не вставил код. Я не думаю, что это полезно, если код не работает – Sreedhar

+0

@Cyber ​​Я приложил файл docx в этой ссылке - ничего, кроме этого – Sreedhar

ответ

4

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

from docx.api import Document 

# Load the first table from your document. In your example file, 
# there is only one table, so I just grab the first one. 
document = Document('Books.docx') 
table = document.tables[0] 

# Data will be a list of rows represented as dictionaries 
# containing each row's data. 
data = [] 

keys = None 
for i, row in enumerate(table.rows): 
    text = (cell.text for cell in row.cells) 

    # Establish the mapping based on the first row 
    # headers; these will become the keys of our dictionary 
    if i == 0: 
     keys = tuple(text) 
     continue 

    # Construct a dictionary for this row, mapping 
    # keys to values for this row 
    row_data = dict(zip(keys, text)) 
    data.append(row_data) 

Это даст вам:

data = [ 
    {u'Pub.': u'Penguin Books', 
    u'Auther': u'Edward de BONO', 
    u'Sr. No.': u'1', 
    u'Name of Book': u'Six Thinking Hats' 
    }, 
    ... 
] 

Если вы просто хотите кортеж для каждой строки, вы должны вместо создания словаря просто установить row_data до значения кортежа text, так что в цикл вместо построения dict, сделайте следующее:

# Construct a tuple for this row 
row_data = tuple(text) 
data.append(row_data) 

Теперь data будет держать что-то вроде этого, вместо:

data = [ 
    (u'1', 
    u'Six Thinking Hats', 
    u'Edward de BONO', 
    u'Penguin Books' 
), 
... 
] 

Тогда вы можете пропустить построения keys, очевидно, (но все же пропустить первый ряд!).

Смежные вопросы