Файл Word в json на Python

У меня есть несколько файлов word (doc и docx), содержащих данные следующей формы, и мне нужно преобразовать их в JSON:

1.Name: ABC, Place: Maryland, Country: US, PHONE NO.:1234567890

2.Name: ABC, Place: Maryland, Country: US, PHONE NO.:1234567890

3.Name: ABC, Place: Maryland, Country: US, PHONE NO.:1234567890

какой самый простой способ сделать это в Python?

Вы смотрели на это? python-docx.readthedocs.io/en/latest

Sergio La Rosa 02.04.2018 21:11

да, но ничего не сказано о преобразовании документа в JSON.

Rajat 02.04.2018 21:16

Кажется, вы могли бы проанализировать различные части docx, а затем использовать модуль Json для создания своего индивидуального формата. К сожалению, ничего не готово к использованию

Sergio La Rosa 02.04.2018 21:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
5 217
3

Ответы 3

Для этого нет библиотек / встроенных модулей. Самый простой способ - преобразовать файл в CSV (либо самостоятельно, удалив все запятые, а затем заменив пробелы запятыми, либо используйте программу, если это возможно)

Затем вы можете использовать класс DictReader из пакета csv для преобразования файла в словарь, а затем использовать модуль json, чтобы выгрузить его в строку json.

псевдокод, например после преобразования в CSV.

import json

from csv import DictReader

COLUMN_NAMES = ['your', 'column', 'names,', '...'] 
    #Or the first row will be the column
    #(and the resulting key in the dictionary ) names

jsonCollection = {}
with open("your_csv_file.csv") as csvFile:
    #fieldnames is optional here
    reader = DictReader(csvFile, fieldnames=COLUMN_NAMES)
    for row in reader:
        for colName, rowVal in row.items():
            jsonCollection.setdefault(colName, []).append(rowVal)

json.dumps(jsonCollection) #should get you what you want

почему CSV? OP говорит, что данные находятся в doc и docx

Morse 02.04.2018 21:40

OP также запрашивает это самым простым способом; преобразование csv в словарь (а затем в json) - это встроенная функция в python, тогда как doc / docx не так уж и проста.

mclslee 02.04.2018 21:42

Люди голосуют против без комментариев ... Что вы предлагаете? / пожимать плечами

mclslee 02.04.2018 22:09

Существует docx модуль (хотя он явно не поддерживает файлы .doc старого стиля), который вы можете объединить с программой чтения csv, чтобы разделить столбцы, а затем получить индекс строки из первого столбца.

from docx import Document
import json

document = Document('existing-document-file.docx')
lines = [para.text for para in document.paragraphs]
lines = [line.partition('.') for line in lines]
lines = [(int(row_num), row_text) for row_num, _, row_text in lines]
lines = [(n, [txt.partition(':') for txt in row_text.split(',')]) for n, row_text in lines]
lines = {n: {key.strip(): val.strip() for key, _, val in row} for n, row in lines}
json_result = json.dumps(lines)

С вашим образцом ввода я получаю следующий результат с использованием этого кода:

'{"1": {"Name": "ABC", "Place": "Maryland", "Country": "US", "PHONE NO.": "1234567890"},
"2": {"Name": "ABC", "Place": "Maryland", "Country": "US", "PHONE NO.": "1234567890"},
"3": {"Name": "ABC", "Place": "Maryland", "Country": "US", "PHONE NO.": "1234567890"}}'

Используемые библиотеки:

  • Для преобразования docx в текст используйте docx2text
  • для преобразования json используйте библиотеку json
  • для хранения значения в Словарь используйте defaultdict() из collections

Шаги

  1. Преобразование документа в строку с помощью docx2text
  2. Преобразовать строку в список строк, разделенных новой строкой \ncharacter и удалить ненужные пустые пробелы ''
  3. Для каждого элемента в списке, разбитом на :,, производить манипуляции. Для удаления склейки цифр на :2
  4. Сохраните каждую пару ключ, значение в словаре для каждого элемента в списке li в словаре
  5. Добавить объект dict в json_li
  6. Вызов json.dumps(json_li) для создания строки json

Код

import docx2txt, json, collections
# step 1 get docx text
text = docx2txt.process("F:\workspace\StackOverFlow\guac.docx")
# convert to list
li = [x for x in text.split('\n')]
# remove ''s i.e Nones
li = list(filter(None, li))
print(li)
# json list
json_li = []
# convert and store all values
for x in li:
    x = x[2:] # remove 1. 2. 3. ...
    y = x.split(',')
    print(y)
    d = collections.defaultdict()
    for m in y:
        z = m.split(':')
        z1 = [x.strip() for x in z]
        d[z1[0]] = z1[1]
    json_li.append(d)
# JSON conversion
print(json.dumps(json_li, indent=4))

выход

['1.Name: ABC, Place: Maryland, Country: US, PHONE NO.:1234567890', '2.Name: ABC, Place: Maryland, Country: US, PHONE NO.:1234567890', '3.Name: ABC, Place: Maryland, Country: US, PHONE NO.:1234567890']
['Name: ABC', ' Place: Maryland', ' Country: US', ' PHONE NO.:1234567890']
['Name: ABC', ' Place: Maryland', ' Country: US', ' PHONE NO.:1234567890']
['Name: ABC', ' Place: Maryland', ' Country: US', ' PHONE NO.:1234567890']
[
    {
        "Name": "ABC",
        "Place": "Maryland",
        "Country": "US",
        "PHONE NO.": "1234567890"
    },
    {
        "Name": "ABC",
        "Place": "Maryland",
        "Country": "US",
        "PHONE NO.": "1234567890"
    },
    {
        "Name": "ABC",
        "Place": "Maryland",
        "Country": "US",
        "PHONE NO.": "1234567890"
    }
]

Обновление файла doc

Если у вас есть файлы doc, используйте

import textract
text = textract.process("path_to_file")

Другие вопросы по теме