为什么 isspace() 对于来自 docx python 库的空字符串返回 false?

Why is isspace() returning false for strings from the docx python library that are empty?

我的 objective 是从多个 Microsoft Word 文档的 numbered/bulleted 列表中提取字符串,然后将这些字符串组织成一个单行字符串,其中每个字符串按以下方式排序: 1.string1 2.string2 3.string3 etc. 我将这些单行字符串称为程序,由 'steps' 1., 2., 3. 等

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

MSword中的numbered/bulleted列表格式都差不多,只是有的用数字,有的用项目符号,有的在第一个点之前多了一行space,或者多了一行[=最后一点后 75=]s。

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

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

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

段落关键字 4:任意文本

段落关键字 5:任意文本

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

段落关键字 6:任意文本

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

当 numbered/bulleted 列表的格式没有额外的行 spaces 时,我的代码工作正常,例如在 "paragraph keyword 1:" 和 "paragraph keyword 2:" 之间。

我试图使用 isspace() 来隔离存在额外行 space 的实例,这些行不属于我想包含在我的过程字符串中的列表.

这是我的代码:

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
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

不幸的是,我没有办法将输出放入这个post,但问题是每当word doc中有一个空行时,isspace() returns false,并且数字 "x." 被分配给空 space,所以我最终得到类似这样的结果: 1. 2.Step 1 3.Step 2 4.Step 3 5. 6.(这是代码中 print(procedure3) 的最后一次迭代)

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

我是不是用错了 isspace()?我没有检测到的字符串中是否存在导致 isspace() 到 return false 的内容?有没有更好的方法来完成这个?

使用测试:

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

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