与while循环中的open语句有什么不对吗

问题描述:

我剪下了我试图完成的脚本的一部分。我期待在每次迭代后得到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

你并不需要关闭文件时,您用开放使用()。 –

滥用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