为什么循环没有打印正确的语句?

why the loop is not printing the correct statements?

我正在编写一些代码来检查 Word 文档中使用的字体的颜色。我在 PyCharm(社区版 2021.3.3)上使用 python 3.10.4 和 python-docx 库(版本 0.8.1.1)。

此处检查的文本格式为 'Normal' 样式。唯一接受的颜色是自动黑色,python-docx 打印为 None 作为默认颜色。

当我执行我的代码时(如下所示),唯一打印的语句是:“普通文本字体颜色为黑色。”这是我使用包含黑色和红色文本的文档时的结果。所以在这种情况下,它应该打印“普通文本包含无法识别的字体颜色:”以及 norm_misc_color.

的内容

我认为代码中的这个错误可能是由于他们在最后一个循环块中使用了 None 方式。集合 norm_color 和 norm_misc_color 根据需要打印正确的值。我想知道如何在特定条件下打印正确的语句。任何形式的帮助将不胜感激。如果对代码有任何疑问,请提出。

import docx  # import the python-docx library
WordFile = docx.Document("state/the/file/directory/here")  # Word document file directory for python-docx 

norm_color = set()  # store all Normal style font colors in the set norm_color
norm_misc_color = set()  # store unacceptable Normal style font colors in the set norm_misc_color
for paragraph in WordFile.paragraphs:
    if "Normal" == paragraph.style.name:
        for run in paragraph.runs:
            # check for duplicates and store unique values in the set norm_color
            if run.font.color.rgb not in norm_color:
                norm_color.add(run.font.color.rgb)
                # check if font colors are unacceptable, if so, store in the set norm_misc_color
                if run.font.color.rgb is not None:
                    norm_misc_color.add(run.font.color.rgb)

    # check if all elements in norm_color are "None" 
if None in norm_color:
    # print this if all elements in norm_color are "None" 
    print("Normal text font colour is black.")
    # check if all elements in norm_color are not "None" 
elif None not in norm_color:
    # print this if all elements in norm_color are not "None" and print norm_misc_color content
    print("Normal text contains unrecognised font color(s):", norm_misc_color)
    # print this if all above conditions were not satisfied
else:
    print("Normal text font colour operation failed.")

代码末尾的 if 条件仅检查文件中是否有 some 使用默认字体颜色的文本。它不排除包含多种文本颜色的文件,只要某处包含默认颜色即可。

您可以通过几种不同的方式来更改您的 if/elif 检查,以按照您的评论所说的方式处理您想要的情况。您可以测试 norm_color 是一个只包含 None 且没有其他内容的集合:

if norm_color == {None}:

或者您可以检查 norm_misc_color 是否为空(因为您向其中添加了所有非 None 颜色):

if not norm_misc_color: # an empty set is falsey

我注意到您可能不需要同时使用 ifelif,看起来确实是为了以一种或另一种方式处理所有可能的文件.我不确定什么情况应该落入 else,因此您可以摆脱用于 elif 的否定条件,只需在此处使用 else,删除“操作失败”的情况是不可能发生的。