2014-03-31 52 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文件,通過這些結構修改期望的值,並再次寫出,而不會丟失數據。

相關問題