2017-02-09 95 views
2

我剪下了我試圖完成的腳本的一部分。我期待在每次迭代後得到mylineS.split()[0]的新結果。對於每次迭代,outS.txtoutT.txtcommandC的結果,並且在每次迭代中結果是不同的。但mylineS.split()[0]爲每次迭代帶來第一個結果。與while循環中的open語句有什麼不對嗎

我想我的方法有什麼問題,有什麼想法?

B = 0 
while B < len(Source_Tdevs): 
    devS = Source_Tdevs[B] 
    devT = Target_Tdevs[B] 
    subprocess.run(commandC, shell=True) 
    print (devS) 
    with open('outS.txt', 'r') as gS: 
     CS = len(gS.readlines()) 
     mylineS = linecache.getline('outS.txt', CS -1) 
     Source_Tdevs_SGs.append(mylineS.split()[0]) 
     **print (mylineS.split()[0])** 
     gS.close() 
    with open('outT.txt', 'r') as gT: 
     CT = len(gT.readlines()) 
     mylineT = linecache.getline('outT.txt', CT - 1) 
     Target_Tdevs_SGs.append(mylineT.split()[0]) 
     gT.close() 
    subprocess.run('del outS.txt, outT.txt', shell=True) 
    B= B + 1 

commandC是subprocess.run(commandC, shell=True)之上的一行。我正在寫作底部。

commandC = 'set "SYMCLI_OFFLINE=1" & set "SYMCLI_DB_FILE=C:\PROGRAM FILES\EMC\SYMAPI\DB\SYMAPI_DB.BIN" & call symaccess -sid %s list -type storage -dev %s > outS.txt & call symaccess -sid %s list -type storage -dev %s > outT.txt' % (
     sid, devS, sid, devT) 
+2

你並不需要關閉文件時,您用開放使用()。 –

回答

0

濫用linecache模塊。該linecache旨在被用於獲取從Python源代碼行源代碼:

的linecache模塊允許一個獲得從Python源文件中的任何線,同時試圖內部優化,採用了高速緩衝存儲器,常見的情況是從單個文件中讀取許多行。這被traceback模塊用來檢索包含在格式化回溯中的源代碼行。

正如文中所暗示的那樣,模塊還會將文件的內容保留在內存中,因此僅在第一次運行時纔會提供正確的輸出。一個簡單的補救辦法是通過使用

linecache.checkcache('outS.txt') 

到緩存中無效雖然更好的事情將使用linecache在所有(這並不意味着對於這一點,您的文件後,不斷變化所有);而不是僅僅閱讀使用.readlines()所有線路,並提取最後加上[-1],例如:

lines = gS.readlines() 
last_line = lines[-1] 
+0

感謝您的詳細解答。我不是一個程序員,試圖學習python,你的回答對我來說非常有用。我解決了這個問題。 – user7528506

+0

@ user7528506通常不會偶然遇到linecache模塊;你有沒有按照堆棧溢出的建議?在那種情況下,我可能會在那裏評論說,'linecache'不應該用於從程序執行期間內容預計會改變的文件中讀取行。 –

+0

我可能在很久以前發現它,但不記得來源。我在我的舊腳本中使用它,現在從那裏複製它。 – user7528506