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

时间:2014-03-31 21:17:03

标签: python python-2.7 python-3.x

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

<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? (-0.597976)中的Vertex 0

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

6 个答案:

答案 0 :(得分:0)

困难的方法是使用Python Lex / Yacc工具。 最难的(你期望&#34; easy&#34;?)方法是制作识别标记的自定义函数(标记将是&lt; Vertex&gt;,数字,手套,&lt; UV&gt;和&lt; RGBA&gt ;;标记分隔符将是空间)。

对不起,如果你不能保证条目符合CR和LF,那么你所要求的是一种迷你语言。

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

尝试使用此库:Python Lex/Yacc因为您需要的是解析一种语言,即使可以在此处使用正则表达式,您也会以丑陋且无法维护的方式结束。你必须学习语言解析的技巧才能使用它。看看Here

答案 1 :(得分:0)

如果顶点总是在后面的行上,你可以将其作为标记,然后读取下一行。如果您读取第二行.strip()前导空格和尾随空格,然后空格字符.split(),您将获得三个顶点的列表,如此(假设您已将该行读入字符串中)可变的line

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

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

这里真正的挑战是找到<Vertex>标记并阅读后续行。这看起来像是一项家庭作业,所以我会让你先解决这个问题!

答案 2 :(得分:0)

如果您的文件格式正确,那么您应该能够非常轻松地解析文件。假设<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)

答案 3 :(得分:0)

尝试忽略以“&lt;”开头的行,例如:

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()

答案 4 :(得分:0)

此语法类似于Panda3d .egg file

我建议您使用Panda的文件加载,修改和保存功能来安全地处理文件;见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()

答案 5 :(得分:0)

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