Maya/Python函数,它在文本文件中循环,但某些行除外

2024-09-28 01:32:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我到处都找到了一些答案,但我不知道如何建立我想要的东西。如果你能帮忙的话,先谢谢你。在

我有多个文本文件,都是以相同的方式构建的,但每一个文件中都有不同的信息。我想遍历每个文件并逐行返回其中的信息。另一方面,我有一些布尔函数定义是否必须跳过文件中的某一行。例如:“如果boolean1为真且lineincorrespondingfile=40,则跳过该行,否则,读取该行,但跳过第36行和第37行“。在

问题是我不知道如何继续,因为函数知道哪个文件被打开了,读哪一行,如果它必须跳过它。知道我需要在函数的末尾独立地返回每一行。在

到目前为止我的代码是:

def locatorsDatas (self):

    preset = cmds.optionMenu ("presetMenu", q = 1, v = 1)
    rawFile = presetsDir + preset.lower() + ".txt"

    with open(rawFile) as file:
        file.seek (0)
        for lineNum, line in enumerate(file, start = 1):
            if lineNum > 8 : # Skip header
                locator = eval (line)
                locName = locator[0]
                xVal = locator[1]
                yVal = locator[2]
                zVal = locator[3]
                locScale = locator[4]
                locColor = locator[5]
                if locator == "":
                    break

                return (locName, xVal, yVal, zVal, locScale, locColor)

我不知道应该将什么值传递给函数以使它跳过我想要的行,因为我知道我不能直接将它写入函数中,因为每个文件不会在同一行中断。 哦,它只返回文件的一行,而不是分别返回每一行。在

希望一切都清楚了,你能帮我,再次谢谢。在


Tags: 文件函数信息iflinefilepresetlocator
1条回答
网友
1楼 · 发布于 2024-09-28 01:32:41

我看到你的代码有很多问题。在

首先,您总是从第8行返回数据,而不返回任何其他数据。如果您有许多要从文件中提取的值,您可能希望通过使用yield语句而不是return使函数成为生成器。然后调用代码可以使用for循环访问数据,或者将生成器传递给list或接受任何iterable的其他函数。在

def locatorsDatas(self):
    # ...
    lineNum, line in enumerate(file, start=1):
        # ...
        yield results

如果不能使用生成器,但需要函数返回连续的行,则需要将文件迭代器(或者可能是环绕它的enumerate迭代器)保存在函数作用域之外的某个地方。这意味着您不需要每次调用函数时都重新打开文件。你可以这样做:

^{pr2}$

我看到的下一个问题是如何处理每一行以获得单独的数据片段。您使用的是eval,如果您正在处理的数据是稍微受委托的,这是一个非常糟糕的主意。这是因为eval将其参数解释为Python代码。它可以做任何事情,包括从硬盘上删除文件!更安全的版本是ast.literal_eval,它只允许字符串包含Python文本(包括列表、字典和集合,但不允许变量查找、函数调用或其他更复杂的代码)。在

你还有一个错误检查,我认为它不会像你想的那样做。if locator == ""测试可能放置得太晚,无法避免从evald行提取数据的前几行出错。您运行的break语句将导致函数退出而不返回任何内容。如果您只想跳过空行,应该将检查放在循环的顶部,并使用continue而不是{}。在

现在我们终于可以讨论你在题目中所问的问题了。如果要基于各种标志跳过某些行,只需在循环时检查这些标志,并执行continue跳过不想读取的行。我不完全理解您所询问的关于如何传递标志的问题,但是假设您可以将它们作为参数,下面是代码的外观示意图:

^{3}$

显然,您应该使用自己的标志名和逻辑,而不是我为示例代码编写的那些。如果您的逻辑更复杂,您可能更喜欢对每个标志使用单独的if语句,而不是像我那样将它们全部打包成一个单独的条件语句。在

相关问题 更多 >

    热门问题