与while循环中的open语句有什么不对吗
我剪下了我试图完成的脚本的一部分。我期待在每次迭代后得到mylineS.split()[0]
的新结果。对于每次迭代,outS.txt
和outT.txt
是commandC
的结果,并且在每次迭代中结果是不同的。但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)
你滥用的linecache
模块。该linecache旨在被用于获取从Python源代码行源代码:
的linecache模块允许一个获得从Python源文件中的任何线,同时试图内部优化,采用了高速缓冲存储器,常见的情况是从单个文件中读取许多行。这被traceback模块用来检索包含在格式化回溯中的源代码行。
正如文中所暗示的那样,模块还会将文件的内容保留在内存中,因此仅在第一次运行时才会提供正确的输出。一个简单的补救办法是通过使用
linecache.checkcache('outS.txt')
到缓存中无效虽然更好的事情将不使用linecache在所有(这并不意味着对于这一点,您的文件后,不断变化所有);而不是仅仅阅读使用.readlines()
所有线路,并提取最后加上[-1]
,例如:
lines = gS.readlines()
last_line = lines[-1]
感谢您的详细解答。我不是一个程序员,试图学习python,你的回答对我来说非常有用。我解决了这个问题。 – user7528506
@ user7528506通常不会偶然遇到linecache模块;你有没有按照堆栈溢出的建议?在那种情况下,我可能会在那里评论说,'linecache'不应该用于从程序执行期间内容预计会改变的文件中读取行。 –
我可能在很久以前发现它,但不记得来源。我在我的旧脚本中使用它,现在从那里复制它。 – user7528506
你并不需要关闭文件时,您用开放使用()。 –