Hướng dẫn read table from docx python - đọc bảng từ docx python

Bạn có thể sử dụng đoạn trích bên dưới để phân tích tài liệu của mình vào danh sách trong đó mỗi hàng là ánh xạ từ điển giá trị tiêu đề bảng vào giá trị cột.

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)

Điều này sẽ cung cấp cho bạn:

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'
  },
  ...
]

Nếu bạn chỉ muốn một tuple cho mỗi hàng, bạn nên thay vì tạo một từ điển chỉ cần đặt

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'
  },
  ...
]
4 thành giá trị tuple của
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'
  },
  ...
]
5, vì vậy trong vòng lặp thay vì xây dựng
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'
  },
  ...
]
6, làm: làm:

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

Bây giờ,

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'
  },
  ...
]
7 sẽ giữ một cái gì đó như thế này: thay vào đó:

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

Sau đó, bạn có thể bỏ qua việc xây dựng

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'
  },
  ...
]
8, rõ ràng (nhưng vẫn bỏ qua hàng đầu tiên!).

Đối với những người bạn đang làm việc trong lĩnh vực phân tích dữ liệu, học máy (ML) và thực hiện mã hóa của họ trong Python, đã sử dụng gấu trúc, thư viện thao tác dữ liệu và phân tích cho các nhiệm vụ hàng ngày của họ. Pandas đưa ra một tập hợp các API và các hàm khổng lồ cho phép nhập dữ liệu từ các định dạng tệp khác nhau như các giá trị được phân tách bằng dấu phẩy, JSON, SQL, Microsoft Excel dưới dạng các bảng được gọi là DataFrames trong Thế giới Pandas. Gandas cho phép các hoạt động thao tác dữ liệu khác nhau như chọn, lọc, hợp nhất, định hình lại, làm sạch dữ liệu, xử lý tiền xử lý và các tính năng gây tranh cãi dữ liệu.

Không phải tất cả dữ liệu cần thiết để xây dựng các đường ống ML/DL sẽ có sẵn trong cơ sở dữ liệu, tệp CSV hoặc Excel và đôi khi các nhà khoa học dữ liệu và kỹ sư máy học có thể cần đọc một số bảng được nhúng trong tệp tài liệu từ ở định dạng DOCX và xử lý dữ liệu. Tuy nhiên, thư viện PANDAS không cung cấp giải pháp vượt trội để đọc các bảng trong tệp tài liệu. Trong phần còn lại của blog này, tôi sẽ đưa bạn qua kỹ thuật để đạt được chức năng mong muốn này với sự trợ giúp của một thư viện Python khác có tên Python-Docx.

Thiết lập và cài đặt

Trước khi chúng tôi tiếp tục với mã để hiểu bảng trích xuất bảng từ DOCX đến các khung dữ liệu gấu trúc, hãy để nhanh chóng đi qua thiết lập và cài đặt ban đầu. Tôi giả sử Python 3.x đã được cài đặt trong hệ thống của bạn. Nếu không, Python có thể được cài đặt từ liên kết.

Cài đặt Pandas & Python-DOCX

pip install pandas
pip install python-docx

Dữ liệu mẫu

Tôi đã tạo một tài liệu từ đơn giản với một số dữ liệu bảng mẫu. Nó bao gồm ba bảng. Bảng đầu tiên bao gồm một danh mục nhỏ các cuốn sách cũ với một tiêu đề cột duy nhất; Bảng thứ hai xuất hiện không có tiêu đề cột của một người cụ thể trong một bộ phận. Bảng thứ ba chứa thông tin bán hàng của các sản phẩm khác nhau được kéo dài trong một phần tư với hai tiêu đề cột và cột bên ngoài được hợp nhất. Dưới đây là một liên kết đến bảng tính để bạn tải xuống.

Đọc tệp Docx

Nhập các thư viện Pandas và Python-DOCX đầu tiên và sử dụng phương thức tài liệu của Python-Docx để mở và đọc tệp

import pandas as pd
from docx import Document
document = Document("<<docx file path>>")

Đối tượng tài liệu của người Viking xuất hiện với các thuộc tính và phương thức khác nhau.

Vì trọng tâm của chúng tôi là trích xuất dữ liệu từ các bảng trong docx, chúng tôi sẽ sử dụng tài liệu.tables [] để đọc một bảng cụ thể có trong tệp bằng cách truyền số bảng

Xử lý dữ liệu bảng thành Pandas DataFrame

Sử dụng các thuộc tính được xây dựng của thư viện Python-DOCX, đọc từng hàng của bảng và lấy văn bản từ mỗi ô và tạo danh sách Python của danh sách chứa mỗi hàng. Sau đó chuyển đổi cấu trúc dữ liệu Python đó thành Pandas DataFrame.

data = [[cell.text for cell in row.cells] for row in table.rows]
df = pd.DataFrame(data)

Định dạng tùy chỉnh trên DataFrame

(Các) bảng có trong DOCX có thể có nhiều định dạng khác nhau. Hầu hết, trong trường hợp bảng đơn giản, sẽ có tiêu đề đơn hoặc thậm chí đến mà không có tiêu đề cột. Ngoài ra, không hiếm khi thấy một số bảng có nhiều tiêu đề với các ô được hợp nhất. Dựa trên kịch bản trong tay, khung dữ liệu ban đầu nên được định dạng tùy chỉnh để bao gồm các chỉ mục cột thích hợp trước khi chúng tôi bắt đầu với thao tác dữ liệu.

Đối với kịch bản tiêu đề đơn, đặt hàng đầu tiên của DataFrame làm tiêu đề cột và đặt lại chỉ mục hàng.

df = df.rename(columns=df.iloc[0]).drop(df.index[0]).reset_index.(drop=True)

Đối với hai kịch bản tiêu đề, hãy tạo đa chỉ số dựa trên hai giá trị hàng đầu tiên làm tiêu đề cột và đặt lại chỉ mục hàng để bắt đầu từ 0

outside_col, inside_col = df.iloc[0], df.iloc[1]
hier_index = pd.MultiIndex.from_tuples(list(zip(outside_col, inside_col)))
df = pd.DataFrame(data,columns=hier_index).drop(df.index[[0,1]] ).reset_index(drop=True)

Bao bì tất cả các bước trên vào một chức năng

Nó luôn luôn là một thực tiễn mã hóa tốt để đóng gói logic vào một chức năng tùy chỉnh để chúng ta có thể dễ dàng gọi và sử dụng lại mã theo yêu cầu. Đoạn mã dưới đây thực hiện tất cả các logic được đề cập ở trên để truy xuất bạn với gấu trúc DataFrame sau khi chúng tôi vượt qua các tham số mong muốn như tài liệu sẽ được đọc, số bảng và số lượng tiêu đề mà bảng có.

Thực hiện chức năng cho các tình huống khác nhau

Hãy để gọi cho chức năng trên bằng cách truyền các tham số và xem nó có hoạt động cho ba kịch bản được viết không. Tải xuống tệp docx tôi cung cấp trong phần trước và chuyển các tham số như sau. Có ba bảng mẫu trong tài liệu đó. Bảng thứ nhất có một tiêu đề cột, bảng thứ hai không chứa đầu đọc cột trong khi bảng thứ ba có hai tiêu đề cột.

Bảng tiêu đề đơn

document = Document("PandasTableExtraction.docx")
table_num=1
nheader=1
df = read_docx_table(document,table_num,nheader)
print(df)
Output: Books Author Year
0 The Scarlet Letter Nathaniel Hawthorne 1850
1 Heart of Darkness Joseph Conrad 1902
2 The Pearl John Steinbeck 1947
3 Gulliver's Travel Jonathan Swift 1726
4 On the Road Jack Kerouac 1957

Không có bảng tiêu đề

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'
  },
  ...
]
0

Hai bảng tiêu đề

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'
  },
  ...
]
1

Thao tác dữ liệu

Bây giờ chúng tôi có sẵn dữ liệu trong cấu trúc FADAS DATAFRAME, chúng tôi có thể thực hiện tất cả các loại thao tác dữ liệu và hoạt động phân tích mà Gandas hỗ trợ. Tuy nhiên, vì chúng tôi đã trích xuất dữ liệu từ DOCX, tất cả các kiểu dữ liệu cột sẽ được suy ra dưới dạng chuỗi/đối tượng. Do đó, chúng ta có thể cần gõ các cột số và ngày nhất định theo yêu cầu để thực hiện hiệu quả các bộ lọc và hoạt động nhất định trên chúng.

Ví dụ: Bảng đầu tiên được trích xuất chứa cột Năm và nếu chúng ta cần liệt kê các cuốn sách được xuất bản sau năm 1900, chúng ta cần chuyển đổi nó sang cột Int trước tiên

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'
  },
  ...
]
2

Ví dụ: Bảng thứ ba được trích xuất chứa các cột Qty và Giá và nếu chúng ta cần liệt kê các mặt hàng được bán> 1000 đơn vị và giá ≥10 trong tháng 1 năm 2020

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'
  },
  ...
]
2

Đây chỉ là một ví dụ để bạn bắt đầu đọc bảng trong tệp DOCX và chuẩn bị để thực hiện phân tích dữ liệu thêm. Vui lòng đi qua các kỹ thuật thao tác dữ liệu Pandas có sẵn để có được cảm giác về sức mạnh của gấu trúc. Đây là một liên kết hữu ích.

Bản tóm tắt

Trong hướng dẫn này, bạn đã học cách sử dụng tệp DOCX mở và đọc có chứa các bảng. Bạn đã thấy cách tải các bảng vào đối tượng Pandas DataFrame và chuẩn bị bằng cách thay đổi các kiểu dữ liệu và khám phá dữ liệu bằng gấu trúc. Phân tích dữ liệu đòi hỏi rất nhiều thử nghiệm và lỗi. Thử nghiệm này có thể là thách thức, nhưng cũng cung cấp cho bạn rất nhiều niềm vui và học tập!

Làm cách nào để đọc một bảng từ Docx trong Python?

Xử lý dữ liệu bảng đến Pandas DataFrame. Sử dụng các thuộc tính được xây dựng của thư viện Python-DOCX, đọc từng hàng của bảng và lấy văn bản từ mỗi ô và tạo danh sách Python của danh sách chứa mỗi hàng. Sau đó chuyển đổi cấu trúc dữ liệu Python đó thành Pandas DataFrame.read each rows of the table and retrieve the text from each cells and create python list of list containing each row. Then convert that python data structure to pandas DataFrame.

Làm thế nào để bạn đọc một cái bàn trong Python?

Những điểm chính..
Sử dụng thư viện Pandas để lấy số liệu thống kê cơ bản ra khỏi dữ liệu bảng ..
Sử dụng index_col để chỉ định rằng các giá trị của cột nên được sử dụng làm tiêu đề hàng ..
Sử dụng dataFrame.info để tìm hiểu thêm về DataFrame ..
DataFrame.....
Sử dụng DataFrame.....
Sử dụng DataFrame ..

Docx2txt Python là gì?

Python-docx2txt Một tiện ích dựa trên Python thuần túy để trích xuất văn bản từ các tệp docx.Mã được lấy và điều chỉnh từ Python-docx.Tuy nhiên, nó cũng có thể trích xuất văn bản từ tiêu đề, chân trang và siêu liên kết.Bây giờ nó cũng có thể trích xuất hình ảnh.A pure python-based utility to extract text from docx files. The code is taken and adapted from python-docx. It can however also extract text from header, footer and hyperlinks. It can now also extract images.

Làm cách nào để đọc một tài liệu từ trong Python?

Approach:..
Mở tệp ở chế độ đọc có chứa chuỗi ..
Sử dụng cho vòng lặp để đọc từng dòng từ tệp văn bản ..
Một lần nữa sử dụng cho vòng lặp để đọc từng từ từ dòng được chia bằng '' ..
Hiển thị từng từ từ mỗi dòng trong tệp văn bản ..