因此,对于作业,我必须阅读一个日志文件,其条目类似于下面列出的条目。
s12773390 dtremote ::1::1:6 Sat Mar 26 14:03 - 15:08 (01:04)
kthao2 dtremote ::1::1:6 Sat Mar 26 11:25 - 11:32 (00:06)
jwoodcock dtremote ::1::1:3 Fri Mar 25 23:23 - 23:29 (00:06)
然后我必须找到特定用户及他们首次登录的日期。到目前为止,我已经提出了。
loginDataFile = open('logindata.dat', 'r')
loginDataList = loginDataFile.readlines()
jwoodcockLogin = [x for x in loginDataList if 'jwoodcock' in x]
print(jwoodcockLogin[len(jwoodcockLogin - 1)])
到目前为止,这让我得到了他们首次登录的列表元素,但是,我只想要日志条目中的日期,而不是整个事情。
答案 0 :(得分:1)
如果保证前三个字段没有空格,则可以执行以下操作:
username, type, address, timestamp = jwoodcockLogin[-1].split(None, 3)
print(timestamp)
将在空格上拆分三次,在第三个空格后以字符串的其余部分作为单个字符串运行。
我注意到,你在这里浪费了大量内存(如果日志文件很大),因为你将整个内存存储在内存中,即使你只关心一行。 / p>
更简单的解决方案可能是:
lasttimestamp = None
# Use with statement to guarantee the file is closed promptly (on block exit)
with open('logindata.dat') as loginDataFile:
# file objects are lazy iterators of their lines, no need to call
# .readlines() and eagerly slurp the whole thing into (limited) memory
for line in loginDataFile:
# Extract username and timestamp, with _ indicating fields that must
# exist, but we don't care about otherwise
username, _, _, timestamp = line.split(None, 3)
if username == 'jwoodcock':
lasttimestamp = timestamp
if lasttimestamp is not None:
print(lasttimestamp)
else:
print("User not found in log")
它永远不会存储超过正在处理的当前行和用户看到的最后一个时间戳,因此1 MB日志文件和10 GB日志文件只在扫描时间上有所不同,您不会冒用完的风险记忆。