我必须阅读文件的最后一行。
我尝试了以下内容:
top_tb_comp_file = open('../../ver/sim/top_tb_compile.tcl', 'r+')
top_tb_comp_end = top_tb_comp_file.readlines()[:-4]
top_tb_comp_file.close()
无法正常工作(我在top_tb_comp_end中获取该文件的第一行)。
答案 0 :(得分:1)
您的索引错误。使用[:-4]
,您要求与实际需要的完全相反。
尝试以下方法:
top_tb_comp_file = open('../../ver/sim/top_tb_compile.tcl', 'r+')
top_tb_comp_end = top_tb_comp_file.readlines()[-4:]
# you noticed that the '-4' is now before the ':'
top_tb_comp_file.close()
修改强>
感谢@Noctis,我围绕这个问题做了一些基准测试。关于collection.deque
选项和file.readlines
选项的速度和内存使用情况。
@Noctis建议的collection
选项在内存使用方面似乎更好 AND 速度:在我的结果中,我在关键行的内存使用情况中观察到一点峰值{在file.readlines()[-4:]
行没有发生的{1}}。此外,我在文件读取阶段重复了速度测试,在这种情况下,collections.deque(file, 4)
选项似乎也更快。
我遇到了一些问题,显示使用SO渲染显示此代码的输出但是如果您安装了包memory_profiler
和psutil
,您应该能够自己看到(使用大文件)。
collections
只需输入以下内容:
import sys
import collections
import time
from memory_profiler import profile
@profile
def coll_func(filename):
with open(filename) as file:
lines = collections.deque(file, 4)
return 0
@profile
def indexing_func(filename):
with open(filename) as file:
lines = file.readlines()[-4:]
return 0
@profile
def witness_func(filename):
with open(filename) as file:
pass
return 0
def square_star(s_toprint, ext="-"):
def surround(s, ext="+"):
return ext + s + ext
hbar = "-" * (len(s_toprint) + 1)
return (surround(hbar) + "\n"
+ surround(s_toprint, ext='|') + "\n"
+ surround(hbar))
if __name__ == '__main__':
s_fname = sys.argv[1]
s_func = sys.argv[2]
d_func = {
"1": coll_func,
"2": indexing_func,
"3": witness_func
}
func = d_func[s_func]
start = time.time()
func(s_fname)
elapsed_time = time.time() - start
s_toprint = square_star("Elapsed time:\t{}".format(elapsed_time))
print(s_toprint)
n为1,2或3。
答案 1 :(得分:1)
以下示例打开名为names.txt
的文件,并打印文件中的最后4行。应用于您的示例,您只需要删除第2行,第5行和第7行中给出的模式。其余的很简单。
#! /usr/bin/env python3
import collections
def main():
with open('names.txt') as file:
lines = collections.deque(file, 4)
print(*lines, sep='')
if __name__ == '__main__':
main()