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