У меня есть несколько файлов 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?
да, но ничего не сказано о преобразовании документа в JSON.
Кажется, вы могли бы проанализировать различные части docx, а затем использовать модуль Json для создания своего индивидуального формата. К сожалению, ничего не готово к использованию






Для этого нет библиотек / встроенных модулей. Самый простой способ - преобразовать файл в 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
OP также запрашивает это самым простым способом; преобразование csv в словарь (а затем в json) - это встроенная функция в python, тогда как doc / docx не так уж и проста.
Люди голосуют против без комментариев ... Что вы предлагаете? / пожимать плечами
Существует 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"}}'
docx2textjsondefaultdict() из collectionsdocx2text\ncharacter и удалить ненужные пустые пробелы '':,, производить манипуляции.
Для удаления склейки цифр на :2li в словареjson_lijson.dumps(json_li) для создания строки jsonimport 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, используйте
import textract
text = textract.process("path_to_file")
Вы смотрели на это? python-docx.readthedocs.io/en/latest