繁体   English   中英

如何阅读文本文件并替换数字?

[英]How can I read a text file and replace numbers?

如果我在文本文件中有很多这些文件;

<Vertex> 0 {
  -0.597976 -6.85293 8.10038
  <UV> { 0.898721 0.149503 }
  <RGBA> { 0.92549 0.92549 0.92549 1 }
}

...

<Vertex> 1507 {
  12 -5.3146 -0.000708352
  <UV> { 5.7487 0.180395 }
  <RGBA> { 0.815686 0.815686 0.815686 1 }
}

如何阅读文本文件,并在第二行的第一个数字中加上25? Vertex 0 -0.597976

我尝试使用.split(' ')在每个空格处分割第二行的文本,然后在第三个元素上使用float()并添加25,但是我不知道如何在文本文件中隐式选择该行。

困难的方法是使用Python Lex / Yacc工具。 最困难的方法(您是否期望“简单”吗?)是使自定义函数识别令牌(令牌为<Vertex>,数字,括号,<UV>和<RGBA>;令牌分隔符为空格)。

很抱歉,如果您不能保证条目尊重CR和LF,那么您要问的是一种迷你语言。

另一个丑陋(甚至更难!)的方法是,因为您不使用该迷你语言使用递归,所以使用正则表达式。 但是以相同的方式和数量,正则表达式解决方案将是漫长而丑陋的(相信我:真的很长)。

尝试使用该库: Python Lex / Yacc,因为您需要的是解析一种语言,即使在这里可以使用正则表达式,您也将以一个丑陋且难以维护的结尾。 您必须学习使用语言解析的技巧。 在这里看看

如果顶点始终在之后,则可以将其作为标记,然后阅读下一行。 如果您读第二行, .strip()和结尾的空格,然后阅读.split().strip()空格字符,则将获得三个顶点的列表,如下所示(假设您已将该行读入字符串可变line

>>> line = line.strip()
>>> verticies = line.split(' ')
>>> verticies 
    ['-0.597976', '-6.85293', '8.10038']

现在怎么办? 在列表中的第一项上调用float() ,然后将25加到结果中。

这里真正的挑战是找到<Vertex>标记并读取下一行。 这看起来像是一项家庭作业,所以我会让您首先感到困惑!

如果您的文件格式正确,那么您应该可以很轻松地解析该文件。 假设<Vertex>始终在一行上,而只有三个数字在一行上,则可以执行以下操作:

newFile = []
while file:
    line = file.readline()
    newFile.append(line)
    if '<Vertex>' in line:
        line = file.readline()
        entries = line.strip().split()
        entries[0] = str(25+float(entries[0]))
        line = '  ' + ' '.join(entries)
        newFile.append(line)

with open(newFileName, 'w') as fileToWrite:
    fileToWrite.writelines(newFile)

尝试忽略以“ <”开头的行,例如:

L=["<Vertex> 0 {",
   "-0.597976 -6.85293 8.10038",
   "<UV> { 0.898721 0.149503 }",
   "<RGBA> { 0.92549 0.92549 0.92549 1 }"
   ]

for l in L:
    if not l.startswith("<"):
        print l.split(' ')[0]

或者,如果您从文件中读取数据:

f = open("test.txt", "r")

for line in f:
    line = line.strip().split(' ')
    try:
        print float(line[0]) +  25
    except:
        pass

f.close()

该语法看起来像是Panda3d .egg文件

我建议您使用熊猫的文件加载,修改和保存功能来安全地处理文件; 参见https://www.panda3d.org/manual/index.php/Modifying_existing_geometry_data

就像是:

INPUT = "path/to/myfile.egg"

def processGeomNode(node):
    # something using modifyVertexData()

def main():
    model = loader.loadModel(INPUT)

    for nodePath in model.findAllMatches('**/+GeomNode').asList():
        processGeomNode(nodePath.node())

if __name__=="__main__":
    main()

这是一个Panda3D .egg文件。 修改数据的最简单,最可靠的方法是使用Panda3D的EggData API解析.egg文件,通过这些结构修改所需的值,然后再次将其写出,而不会丢失数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM