Python-docx: Ошибка значения: слишком много значений для распаковки (ожидается 2)

#python #python-docx

Вопрос:

Я пытаюсь извлечь текст из абзацев.

Но есть абзац, содержащий два объекта(списка).

Как я могу взять только первый список?

 print(doc.paragraphs[i].runs)
 

вывод(два списка):

 [<docx.text.run.Run object at 0x000002A9AAD98E08>, <docx.text.run.Run object at 0x000002A9AAD98B88>, <docx.text.run.Run object at 0x000002A9AAD98648>, <docx.text.run.Run object at 0x000002A9AAD98088>, <docx.text.run.Run object at 0x000002A9AAD98548>, <docx.text.run.Run object at 0x000002A9AAD98A48>, <docx.text.run.Run object at 0x000002A9AAD98988>, <docx.text.run.Run object at 0x000002A9AAD98A88>, <docx.text.run.Run object at 0x000002A9AAD98048>, <docx.text.run.Run object at 0x000002A9AAD98708>, <docx.text.run.Run object at 0x000002A9AAD98BC8>, <docx.text.run.Run object at 0x000002A9AAD98188>, <docx.text.run.Run object at 0x000002A9AAD98B08>, <docx.text.run.Run object at 0x000002A9AAD98108>, <docx.text.run.Run object at 0x000002A9AAD986C8>, <docx.text.run.Run object at 0x000002A9AAD982C8>, <docx.text.run.Run object at 0x000002A9AAD981C8>, <docx.text.run.Run object at 0x000002A9AAD98948>, <docx.text.run.Run object at 0x000002A9AAD98288>, <docx.text.run.Run object at 0x000002A9AAD98248>, <docx.text.run.Run object at 0x000002A9AAD98808>, <docx.text.run.Run object at 0x000002A9AAD98208>, <docx.text.run.Run object at 0x000002A9AAD98DC8>, <docx.text.run.Run object at 0x000002A9AAD98608>, <docx.text.run.Run object at 0x000002A9AAD98688>, <docx.text.run.Run object at 0x000002A9AAD98148>, <docx.text.run.Run object at 0x000002A9AAD98C48>, <docx.text.run.Run object at 0x000002A9AAD98E48>, <docx.text.run.Run object at 0x000002A9AAD98A08>, <docx.text.run.Run object at 0x000002A9AAD98908>]
[<docx.text.run.Run object at 0x000002A9AADB4D88>, <docx.text.run.Run object at 0x000002A9AADB4CC8>, <docx.text.run.Run object at 0x000002A9AADB4BC8>, <docx.text.run.Run object at 0x000002A9AADB4D48>]
 

при использовании удара

 print(doc.paragraphs[i].runs[0])
 

затем следует первый пункт обоих списков. Мне нужен один из этих двух списков.

 <docx.text.run.Run object at 0x0000028F33B58E88>
<docx.text.run.Run object at 0x0000028F33B74C48>
 

при попытке использовать два значения:

 a,b = doc.paragraphs[i].runs
 

затем появилась ошибка:

 ValueError: too many values to unpack (expected 2)
 

Как я могу это сделать?

===Обновление===

Я нашел свою ошибку в коде! Это потому, что мое если-условие. Спасибо, что ответили на мой вопрос.

Комментарии:

1. что такое «я» и где оно инициализировано? пролейте некоторый свет на то, как вы получили входные данные. doc.paragraphs[i].runs

2. @dhamodaran я думаю, что код находится в цикле for

3. Да, это то, что сказал @PyGamer0 !

4. @AsterLin показывает минимальный код, необходимый для воспроизведения этой ошибки, включая цикл(циклы) for. Не просите нас угадать, какой код вы использовали для получения этого результата; это пустая трата нашего времени. Например, если я попытаюсь бежать print(doc.paragraphs[i].runs) , я получу NameError: name 'doc' is not defined .

Ответ №1:

 a,b,*_ = doc.paragraphs[i].runs
 

a и b получают первые 2 списка, _ получает остальные.

Изменить: вот как получить первый список

 a, *_ = doc.paragraphs[i].runs
 

Комментарии:

1. Привет, спасибо, что ответили. Но я хочу получить первый список, а не первые 2 значения из двух списков.

2. Привет, это то же самое. Теперь ситуация похожа на A= [1,2] [3,4], и если я возьму A[0], то результат будет 1,3. Однако то, что я хочу, это [1,2].

3. @AsterLin как это возможно? А = [[1,2],[3,4]], A[0] должен вернуть [1,2]?! Или это другая структура?

4. Я тоже не знаю, почему ?? Может быть, структура действительно отличается от любой другой? Надеюсь, кто-нибудь скажет мне, почему (грустно)

Ответ №2:

Вы можете попробовать ast, если это поможет

 import ast
input = doc.paragraphs[i].runs
output = ast.literal_eval(input,ensure_ascii=False).encode('utf8')
 

Комментарии:

1. Здравствуйте, спасибо, что ответили. Однако возникает ошибка: ошибка значения: неправильный узел или строка: [<объект docx.text.run.Run в 0x0000018ECB433EC8>]