[英]How can I read a text file and replace numbers?
如果我在文本文件中有很多這些文件;
<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? ( Vertex 0
-0.597976
)
我嘗試使用.split(' ')
在每個空格處分割第二行的文本,然后在第三個元素上使用float()
並添加25,但是我不知道如何在文本文件中隱式選擇該行。
困難的方法是使用Python Lex / Yacc工具。 最困難的方法(您是否期望“簡單”嗎?)是使自定義函數識別令牌(令牌為<Vertex>,數字,括號,<UV>和<RGBA>;令牌分隔符為空格)。
很抱歉,如果您不能保證條目尊重CR和LF,那么您要問的是一種迷你語言。
另一個丑陋(甚至更難!)的方法是,因為您不使用該迷你語言使用遞歸,所以使用正則表達式。 但是以相同的方式和數量,正則表達式解決方案將是漫長而丑陋的(相信我:真的很長)。
嘗試使用該庫: Python Lex / Yacc,因為您需要的是解析一種語言,即使在這里可以使用正則表達式,您也將以一個丑陋且難以維護的結尾。 您必須學習使用語言解析的技巧。 在這里看看
如果頂點始終在之后,則可以將其作為標記,然后閱讀下一行。 如果您讀第二行, .strip()
和結尾的空格,然后閱讀.split()
, .strip()
空格字符,則將獲得三個頂點的列表,如下所示(假設您已將該行讀入字符串可變line
:
>>> line = line.strip()
>>> verticies = line.split(' ')
>>> verticies
['-0.597976', '-6.85293', '8.10038']
現在怎么辦? 在列表中的第一項上調用float()
,然后將25加到結果中。
這里真正的挑戰是找到<Vertex>
標記並讀取下一行。 這看起來像是一項家庭作業,所以我會讓您首先感到困惑!
如果您的文件格式正確,那么您應該可以很輕松地解析該文件。 假設<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)
嘗試忽略以“ <”開頭的行,例如:
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()
該語法看起來像是Panda3d .egg文件 。
我建議您使用熊貓的文件加載,修改和保存功能來安全地處理文件; 參見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()
這是一個Panda3D .egg文件。 修改數據的最簡單,最可靠的方法是使用Panda3D的EggData API解析.egg文件,通過這些結構修改所需的值,然后再次將其寫出,而不會丟失數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.