如何使用Python解析/提取文件中的特定数据

我遇到了一个有趣的问题,正在尝试解决,我已经做了一些努力,但还需要一点帮助。我有一个包含一些lua代码的压缩文件。我正在尝试读取此文件并构建一个文件路径。但是,根据生成此文件的位置,它可能包含一些信息,也可能缺少一些信息。以下是我需要解析的示例压缩文件。

模块“foo1”
模块“foo2”
模块“common.command”“common/command.lua”
模块“common.common”“common/common.lua”
模块“common.diagnostics”“common/diagnostics.lua”

这是我编写的代码,用于读取文件并搜索包含模块的行。您将看到此文件有三个不同的部分或列。如果查看第三行,则列1为“模块”,列2为“common.command”,列3为“common/command.lua”。

以列3为例...如果第3列中存在数据,则我只需要去掉引号并获取列3中的数据。在这种情况下,将是common/command.lua。如果第3列中没有数据,则需要从第2列中获取数据,将句点(.)替换为os.path.sep,并在文件上加上.lua扩展名。同样,以第3行为例,我需要提取common.common并将其变为common/common.lua。

squishyContent = []
if os.path.isfile(root + os.path.sep + "squishy"):
    self.Log("Parsing Squishy")
    with open(root + os.path.sep + "squishy") as squishyFile:
        lines = squishyFile.readlines()
    squishyFile.close()

    for line in lines:
        if line.startswith("Module "):
            path = line.replace('Module "', '').replace('"', '').replace("\n", '').replace(".", "/") + ".lua"

只需要一些示例/帮助来解决这个问题。

点赞
用户1222951
用户1222951

这可能听起来有点傻,但最简单的方法就是将你告诉我们的关于你的任务的一切都转换成代码。

for line in lines:
    # 如果一行不是以 "Module " 开头,忽略它
    if not line.startswith('Module '):
        continue

    # 就像你说的,有3列数据,它们以一个空格分隔,因此我们将把文本拆分为3个列
    line = line.split(' ')
    
    #如果有超过2列数据,我们将使用第3列的文本(并且去掉引号“”)
    if len(line) > 2:
        line = line[2][1:-1]
    # 否则...
    else:
        line = line[1] # 使用第2列的文本
        line = line[1:-1] # 去掉引号
        line = line.replace('.', os.path.sep) # 将点换成斜线
        line += '.lua' # 然后加上 .lua
    print line # 证明它能工作。

对于这样一个简单的问题,很容易让程序做到与您自己手动完成任务的一模一样。

2014-09-28 06:09:32