2014-03-31 49 views
0

如果我在文本文件中有很多这样的东西,如何读取文本文件并替换数字?

<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行的第一个数字加上25? (在Vertex 0-0.597976

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

+0

你还有什么文件吗?或只是这样的条目? –

+0

只是这样的条目。 @RobWatts –

+2

你有什么尝试?我没有看到任何错误的代码片断,表明您实际上已经编写了一些代码。如果你还没有,尝试一下。尝试*任何*。 – bedwyr

回答

0

试图忽略以“<”,例如启动线:

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

难的方法是使用Python莱克斯/ Yacc的工具。 最难的(?你以为“易”)的方法是创建一个自定义功能识别标记(标记将<顶点>,数字,护腕,<UV>和<RGBA>;令牌分隔符是空格)。

我很抱歉,但你所要求的是一个小型的语言,如果你不能保证条目尊重和CR LF类。

再丑(甚至更难!)的方法是,请你以后不要在该语言小,使用正则表达式使用递归。但是正则表达式的解决方案将会以相同的方式和数量变得漫长而丑陋(相信我:真的很长)。

尝试使用此库:Python Lex/Yacc因为你需要的是解析一种语言,甚至当正则表达式可以在这里使用时,你会以丑陋和不可维护的结束。你必须学习语言解析的技巧来使用它。看看Here

0

如果verticies将永远是上线之后,你可以看看,作为一个标记,然后读取下一行。如果你读了第二行,.strip()领导和空格字符结尾的空白,然后.split(),你将有你的三个verticies的列表,像这样(假设您已经阅读行成一个字符串varaible line

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

现在怎么办?在你的列表中的第一个项目叫float(),再加入25到结果。

这里真正的挑战是找到<Vertex>标记和阅读下一行。这看起来像一个家庭作业,所以我我会让你对此有点头疼!

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

这不是一种无损的方法,因为加载的数据将是原始.egg数据的优化版本,并且因为您可以通过.bam文件而不是.egg再次将其写出的唯一方式文件。 (将.bam转换回.egg也是一个有损耗的过程。) – rdb

0

这是一个的Panda3D .egg文件。在其中修改数据的最简单和最可靠的方法是使用Panda3D的EggData API来解析.egg文件,通过这些结构修改期望的值,并再次写出,而不会丢失数据。

相关问题