2016-04-12 67 views
0

我對Python有點新,我試圖簡化我現有的代碼。 現在,我用不同的字符串重複5次代碼。我想讓代碼有一次,並讓它通過一個字符串列表。如何遍歷Python中的字符串列表

目前我有:

def wiScanFormat(): 

    File = open("/home/pi/gpsMaster/WiScan.txt", "r") 
    data = File.read() 
    File.close() 
    MAC = data.replace("Address:", "\nAddress, ") 
    File = open("/home/pi/gpsMaster/WiScan.txt", "w") 
    File.write(MAC) 
    File.close() 

    File = open("/home/pi/gpsMaster/WiScan.txt", "r") 
    data = File.read() 
    File.close() 
    SSID = data.replace("ESSID:", "\nESSID, ") 
    File = open("/home/pi/gpsMaster/WiScan.txt", "w") 
    File.write(SSID) 
    File.close() 

    File = open("/home/pi/gpsMaster/WiScan.txt", "r") 
    data = File.read() 
    File.close() 
    FREQ = data.replace("Frequency:", "\nFrequency, ") 
    File = open("/home/pi/gpsMaster/WiScan.txt", "w") 
    File.write(FREQ) 
    File.close() 

    File = open("/home/pi/gpsMaster/WiScan.txt", "r") 
    data = File.read() 
    File.close() 
    QUAL = data.replace("Quality", "\nQuality, ") 
    File = open("/home/pi/gpsMaster/WiScan.txt", "w") 
    File.write(QUAL) 
    File.close() 

    File = open("/home/pi/gpsMaster/WiScan.txt", "r") 
    data = File.read() 
    File.close() 
    SIG = data.replace("Signal level", "\nSignal Level, ") 
    File = open("/home/pi/gpsMaster/WiScan.txt", "w") 
    File.write(SIG) 
    File.close() 

我想什麼有:

ORG = ['Address:', 'ESSID:'...etc] 
NEW = ['\nAddress, ' , '\nESSID, ' , ... etc] 

和運行,通過:

File = open("/home/pi/gpsMaster/WiScan.txt", "r") 
    data = File.read() 
    File.close() 
    ID = data.replace("ORG", "NEW") 
    File = open("/home/pi/gpsMaster/WiScan.txt", "w") 
    File.write(ID) 
    File.close() 

我試着運行什麼我忍了,但它似乎沒有按照我需要的方式進行格式化。

從上面的輸出是這樣的:

Cell 46 - Address: xx:xx:xx:xx:xx:xx ESSID:"MySSID" Frequency:2.412 GHz (Channel 1) Quality=47/100 Signal level=48/100 Quality=47/100 Signal level=48/100 

但它應該是這個樣子(當我運行中的字符串相同的塊分開它):

xx:xx:xx:xx:xx:xx MySSID 5.18 GHz (Channel 36) 0.81 0.99 

如何我應該通過我的字符串列表來循環這段代碼嗎? 有兩個字符串,我需要找到和替換,新老,所以他們將不得不一起工作。這些列表顯然是相同的,我需要它們按正確的順序排列。具有地址的地址,具有ESSID的ESSID等。

在此先感謝!

+1

你真正打開同一文件五次就可以執行不同的編輯序列,或者我誤解了? – khelwood

+0

@khelwood是的,目前我在。我知道這不是最有效的方式去這個,這就是爲什麼我正在探索其他選項 編輯:實際上,它正在開放10倍。 5表示讀取,5表示寫入 – sjo91190

+0

1.如果我沒有記錯,'replace'只替換第一個匹配項。改用[re.sub](https://docs.python.org/2/library/re.html#re.sub)。 2。使用'with open(「..」)作爲f:#做某事而不是'f = open(「..」)''和'f.close'。 3.發佈格式化的示例數據! – knh170

回答

1

嘗試是這樣的:

ORG = ['Address:', 'ESSID:'...etc] 
NEW = ['\nAddress, ' , '\nESSID, ' , ... etc] 

File = open("/home/pi/gpsMaster/WiScan.txt", "r") 
data = File.read() 
File.close() 
for org, new in zip(ORG, NEW): 
    data = data.replace(org, new) 
File = open("/home/pi/gpsMaster/WiScan.txt", "w") 
File.write(data) 
File.close() 

(注意雙向拉鍊作品:https://docs.python.org/2/library/functions.html#zip

+0

這工作完美,正是我一直在尋找。謝謝!我在發佈之前試圖使用zip,但無法弄清楚。 – sjo91190

1

如果我正在閱讀你的問題,你打開同一個文件,做一個小改動,保存,然後再關閉五次。您可以打開一次,進行所有更改,然後保存。舉例來說,像這樣:

filename = "/home/pi/gpsMaster/WiScan.txt" 
with open(filename, 'r') as fin: 
    data = fin.read() 
data = data.replace("Address:", "\nAddress, ") 
data = data.replace("ESSID:", "\nESSID, ") 
data = data.replace("Frequency:", "\nFrequency, ") 
data = data.replace("Quality", "\nQuality, ") 
data = data.replace("Signal level", "\nSignal Level, ") 
with open(filename, 'w') as fout: 
    fout.write(data) 

如果您想使用列表(ORGNEW)爲您更換,你可以這樣做:

with open(filename, 'r') as fin: 
    data = fin.read() 
for o,n in zip(ORG, NEW): 
    data = data.replace(o,n) 
with open(filename, 'w') as fout: 
    fout.write(data) 
1

鑑於你ORGNEW,最簡單的方法做這將是這樣的:

# Open once for both read and write; use with statement for guaranteed close at end of block 
with open("/home/pi/gpsMaster/WiScan.txt", "r+") as f: 
    data = f.read() # Slurp file 
    f.seek(0)  # Seek back to beginning of file 
    # Perform all replacements 
    for orig, repl in zip(ORG, NEW): 
     data = data.replace(orig, repl) 
    f.write(data) # Write new data over old 
    f.truncate()  # If replacement shrunk file, truncate extra 
1

你可能只是這樣做:

def wiScanFormat(path = "/home/pi/gpsMaster/WiScan.txt"): 

    # List of tuples with strings to find and strings to replace with 
    replacestr = [ 
       ("Address:", "\nAddress, "), 
       ("ESSID:", "\nESSID, "), 
       ("Frequency:", "\nFrequency, "), 
       ("Quality", "\nQuality, "), 
       ("Signal level", "\nSignal Level, ") 
       ] 

    with open(path, "r") as file:    # Open a file 
     data = file.read() 

    formated = data 
    for i in replacestr:      # Loop over each element (tuple) in the list 
     formated = formated.replace(i[0], i[1]) # Replace the data 

    with open(path, "w") as file: 
     written = file.write(formated)   # Write the data 

    return written