您可以使用regex并在循环外部编译它。在
在lazy模式下,逐行读取文件。在import re
import matplotlib.pyplot as plt
import pylab
r = re.compile(r'(?<=\.)[0-9]{2,5}(?= \>)')
ports = []
for line in open("test.data", "r"):
ports.append(re.search(r, line).group(0))
# determines the number of lines you want to take into account
i = (len(ports) - 6) // 7
# keeps only the first i elements
ports = ports[0:i]
numBins = 20
plt.hist(ports, numBins, color='red', alpha=0.8)
plt.show()
这段代码考虑到这样一个事实,即您只希望(n-6) / 7的第一项,n是源文件的行数。如果不完全准确,请尝试使用+1/-1。在结束时去掉不需要的项可以使循环不必为检查每个迭代的条件而烦恼。在
编辑:
您可以将以上几点结合起来,以获得更简洁高效的代码:
^{pr2}$
编辑:
如果您认为您的端口列表太大而无法容纳RAM(我觉得不太可能),我的建议是使用端口dict:ports = {}
for line in open("test.data", "r"):
port = re.search(r, line).group(0)
if not ports.get(port, False):
ports[port] = 0
ports[port] += 1
这会给你一些类似的东西:>>> ports
{
"8394": 182938,
"8192": 839288,
"1283": 9839
}
注意,在这种情况下,必须修改对plt.hist的调用。在