0

我的目标是从多个 Microsoft Word 文档中的编号/项目符号列表中提取字符串,然后将这些字符串组织成一个单行字符串,其中每个字符串按以下方式排序:1.string1 2.string2 3.string3 等. 我将这些单行字符串称为过程,由“步骤”1.、2.、3.等组成。

它必须采用这种格式的原因是因为程序字符串被放入数据库,数据库用于创建 Excel 电子表格输出,在电子表格上使用格式化宏,并且有问题的程序字符串必须在此格式以使该宏正常工作。

MSword中的编号/项目符号列表在格式上都是相似的,但有些使用数字,有些使用项目符号,有些在第一个点之前有额外的行空间,或者在最后一个点之后有额外的行空间。

以下文本显示了 Word 文档格式设置的三个不同示例:

段落关键字 1:任意文本
1. 步骤 1
2. 步骤 2
3. 步骤 3
段落关键字 2:任意文本

段落关键字 3:任意文本
• 步骤 1
• 步骤 2
• 步骤 3

第 4 段关键字:任意文本

第 5 段关键字:任意文本

  1. 步骤1
  2. 第2步
  3. 第 3 步

第 6 段关键字:任意文本

(由于某种原因,前两个列表在帖子的格式中没有缩进,但在我的 Word 文档中,所有缩进都是相同的)

当编号/项目符号列表的格式没有多余的行空格时,我的代码可以正常工作,例如在“段落关键字 1:”和“段落关键字 2:”之间。

我试图使用 isspace() 来隔离那些不属于我想要包含在我的过程字符串中的列表的额外行空间的实例。

这是我的代码:

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
def extractStrings(file):
    doc = file
    for i in range(len(doc.paragraphs)):
        str1 = doc.paragraphs[i].text
        if "Paragraph Keyword 1:" in str1:
            start1=i
        if "Paragraph Keyword 2:" in str1:
            finish1=i
        if "Paragraph Keyword 3:" in str1:
            start2=i
        if "Paragraph Keyword 4:" in str1:
            finish2=i
        if "Paragraph Keyword 5:" in str1:
            start3=i
        if "Paragraph Keyword 6:" in str1:
            finish3=i
    print("----------------------------")
    procedure1 = ""
    y=1
    for x in range(start1 + 1, finish1):
        temp = str((doc.paragraphs[x].text))
        print(temp)
        if not temp.isspace():
            if y > 1:
                procedure1 = (procedure1 + " " + str(y) + "." + temp)
            else:
                procedure1 = (procedure1 + str(y) + "." + temp)
            y=y+1
            print(procedure1)
    print("----------------------------")
    procedure2 = ""
    y=1
    for x in range(start2 + 1, finish2):
        temp = str((doc.paragraphs[x].text))
        print(temp)
        if not temp.isspace():
            if y > 1:
                procedure2 = (procedure2 + " " + str(y) + "." + temp)
            else:
                procedure2 = (procedure2 + str(y) + "." + temp)
            y=y+1
            print(procedure2)
    print("----------------------------")
    procedure3 = ""
    y=1
    for x in range(start3 + 1, finish3):
        temp = str((doc.paragraphs[x].text))
        print(temp)
        if not temp.isspace():
            if y > 1:
                procedure3 = (procedure3 + " " + str(y) + "." + temp)
            else:
                procedure3 = (procedure3 + str(y) + "." + temp)
            y=y+1
            print(procedure3)
    print("----------------------------")
    del doc
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

import docx
doc1 = docx.Document("docx_isspace_experiment_042420.docx")
extractStrings(doc1)
del doc1

不幸的是,我无法将输出放到这篇文章中,但问题是,只要单词 doc 中有空行,isspace() 就会返回 false,并且会返回一个数字“x”。分配给空白空间,所以我最终得到类似: 1. 2.Step 1 3.Step 2 4.Step 3 5. 6. (这是代码中 print(procedure3) 的最后一次迭代)

问题是即使我的 python 控制台输出显示字符串只是一个空行,isspace() 也会返回 false。

我是否错误地使用了 isspace()?我没有检测到的字符串中是否存在导致 isspace() 返回 false 的内容?有没有更好的方法来实现这一点?

4

1 回答 1

2

使用测试:

# --- for s a str value, like paragraph.text ---
if s.strip() == "":
    print("s is a blank line")

str.isspace()True如果字符串仅包含空格,则返回。空 str 不包含任何内容,因此不包含空格。

于 2020-04-27T16:58:40.400 回答