2011-08-09 13 views
2

我有了超過200線在此格式的文件:什麼是在多個文件上查找和替換多個查詢的最佳方式?

name old_id new_id 

名稱是沒用的東西,我想目前做的,但我還是想在那兒,因爲它以後可能成爲調試有用。

現在我需要經過的每一個文件夾中,找到的old_id所有實例,並與NEW_ID替換它們。我正在掃描的文件是可能長達數千行的代碼文件。我需要使用我擁有的200多個ID中的每一個來掃描每個文件,因爲有些文件可能在多個文件中使用,並且每個文件多次使用。

要做到這一點,最好的方法是什麼?到目前爲止,我一直在創建python腳本來找出舊ID和新ID的列表,以及哪些匹配對方,但我一直在做效率非常低,因爲我基本上是逐行掃描第一個文件並得到當前行的當前ID,然後我會逐行掃描第二個文件,直到找到匹配項。然後我再次爲第一個文件中的每一行執行了這一操作,最後我閱讀了第二個文件。我不介意這樣做效率低下,因爲它們是小文件。

現在,我在尋找可能介於30-50文件,可以有幾千行代碼的話,我希望它是一個小更高效。這只是一個愛好者項目,所以它不需要超好,我只是不希望它花費超過5分鐘才能找到並替換所有內容,然後查看結果並看到我犯了一個小錯誤並需要重新做一遍。花幾分鐘時間是沒問題的(儘管我確信現在電腦幾乎可以立即做到這一點),但我不想讓它變得荒謬。

那麼什麼是去這樣做的最佳方式?到目前爲止,我一直在使用python,但它不需要是python腳本。我不關心代碼中的高雅或者我做它或者任何事情的方式,我只是想用一種簡單的方法,使用任何最容易使用或實現的工具,用我的新ID替換我所有的舊ID。

實例:

下面是從ID的列表的線。第一部分是名稱,可以忽略,第二部分是舊ID,第三部分是需要替換舊ID的新ID。

unlock_music_play_grid_thumb_01 0x108043c 0x10804f0 

這裏是在文件中的一個例子線進行更換:

const v1, 0x108043c 

我需要能夠取代ID與新的ID,所以它看起來是這樣的:

const v1, 0x10804f0 
+0

你還可以從代碼文件中添加幾行例子來理解我們正在替代的嗎? –

回答

2

使用類似multiwordReplace(我已經編輯就爲您的情況)與mmap

import os 
import os.path 
import re 
from mmap import mmap 
from contextlib import closing 


id_filename = 'path/to/id/file' 
directory_name = 'directory/to/replace/in' 

# read the ids into a dictionary mapping old to new 
with open(id_filename) as id_file: 
    ids = dict(line.split()[1:] for line in id_file)  

# compile a regex to do the replacement 
id_regex = re.compile('|'.join(map(re.escape, ids))) 

def translate(match): 
    return ids[match.group(0)] 

def multiwordReplace(text): 
    return id_regex.sub(translate, text) 

for code_filename in os.listdir(directory_name): 
    with open(os.path.join(directory, code_filename), 'r+') as code_file: 
     with closing(mmap(code_file.fileno(), 0)) as code_map: 
      new_file = multiword_replace(code_map) 
    with open(os.path.join(directory, code_filename), 'w') as code_file: 
     code_file.write(new_file) 
+0

感謝您的代碼,但是我在運行時遇到錯誤。文件 「./multreplace.py」,第29行,在 與關閉(MMAP(code_file.fileno(),0)),爲code_map: mmap.error:[錯誤13]權限被拒絕。我是該文件的所有者,並且可以編輯該文件,所以我不確定爲什麼我要這樣做。 – lemons

+0

@lemons我的不好,你需要用'r +'模式打開文件來獲得可寫的'mmap'。我會編輯。 – agf

+0

好的。所以現在腳本運行,但沒有任何修改。我已將腳本,標識文件和文件夾與所有文件在同一個目錄中全部更改,並且在腳本運行後沒有任何錯誤,完全沒有任何更改。我在做之前做了一個文件夾的備份,並對這兩個文件夾運行diff,並且它們都完全一樣。 – lemons

相關問題