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

Python 如何读取文本文件并替换数字?,python,python-2.7,python-3.x,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>

如果我在一个文本文件中有很多这样的文件

<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 }
}
0{
-0.597976 -6.85293 8.10038
{ 0.898721 0.149503 }
{ 0.92549 0.92549 0.92549 1 }
}
...
1507 {
12 -5.3146 -0.000708352
{ 5.7487 0.180395 }
{ 0.815686 0.815686 0.815686 1 }
}
如何读取文本文件并将25添加到第二行的第一个数字?(
顶点0
中的
-0.597976


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

困难的方法是使用Python Lex/Yacc工具。 最难的方法(您是否认为“容易”?)是创建一个自定义函数来识别标记(标记可以是、数字、大括号和;标记分隔符可以是空格)

很抱歉,如果你不能保证参赛作品尊重CR和LFs,那么你要问的是迷你语言

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


尝试使用这个库:因为您需要的是解析一种语言,即使在这里可以使用regex,您也会以一种丑陋且无法维护的语言结束。要使用它,您必须学习语言解析的技巧。看一看

如果垂直线始终在后面的一行上,您可以将其作为标记,然后阅读下一行。如果您读取第二行,
.strip()
前导和尾随空格,然后按空格字符读取
.split()
,您将得到三个垂直字符的列表,如下所示(假设您已将该行读入字符串变量

>>> line = line.strip()
>>> verticies = line.split(' ')
>>> verticies 
    ['-0.597976', '-6.85293', '8.10038']
现在怎么办?调用列表中的第一项,然后在结果中添加25


这里真正的挑战是找到
标记并阅读下一行。这看起来像是一个家庭作业,所以我让你先把它弄清楚一点!

如果你的文件格式很好,那么你应该能够非常容易地解析文件。假设
总是在一行上,继续一行就这三个数字,你可以这样做:

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)
newFile=[]
而文件:
line=file.readline()
newFile.append(第行)
如果“”在第行中:
line=file.readline()
条目=line.strip().split()
条目[0]=str(25+浮动(条目[0]))
行=“”+“”。联接(条目)
newFile.append(第行)
将open(newFileName,'w')作为fileToWrite:
fileToWrite.writelines(新文件)

尝试忽略以“开头的行。此语法看起来像一个

我建议您使用Panda的文件加载、修改和保存功能来安全地处理文件;请参阅

比如:

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文件,通过这些结构修改所需的值,然后再次写入,而不丢失数据。

文件中还有其他内容吗?或者只有这样的条目?只有这样的条目。@robwattsha您试过了吗?我没有看到任何代码片段出现错误,表明您确实编写了一些代码。如果没有,请尝试一些操作。尝试任何操作。我尝试过使用
.split(“”)
,然后使用
float()在每个空格处拆分第二行的文本
在第三个元素上,加上25,但我不知道如何隐式选择文本文件中的行。@Bedwyrth这不是一种无损方法,因为加载的数据将是原始.egg数据的优化版本,并且您可以通过.bam文件而不是.egg文件再次写出它的唯一方法。(将.bam转换回.egg也是一个有损的过程。)
f = open("test.txt", "r")

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

f.close()
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()