簡體   English   中英

如何閱讀文本文件並替換數字?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM