如果我在文本文件中有很多这些;
<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,但我不知道如何隐式选择文本文件中的行。
答案 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文件,通过这些结构修改所需的值,然后重新写出来,而不会丢失数据。