- 论坛徽章:
- 0
|
原帖由 bohemia 于 2009-8-10 22:23 发表 ![]()
应该不会吧?
readline() 默认不一定会带 \n 的.
见Python文档说明
"""
Read one entire line from the file. A trailing newline character is kept in the string (but may be absent when a file ends ...
谢谢!确实没有\n,是我刚才测试程序的时候用的txt是用vi编译的,vi竟然自动加了一个\n
估计也能用readfiles,同时考虑效率,如下:
logfile = open('access.log', 'r') # web服务器的日志文件,这个文件在不断增加新的行
logfile.seek(0, os.SEEK_END) # 我们只关心新产生的日志信息
while True:
lines = logfile.readlines() # 读取新产生的日志
while len(lines) > 0 and lines[-1][-1] != '\n': # 如果读到了日志,并且日志的最后一行的最后一个字符不是换行,说明日志文件的最后一行没有完,要特别处理,这个地方不用正则效率要高一点
time.sleep(1)
newlines = logfile.readlines()
if len(newlines) == 1: # 如果读取到了一行日志,这行日志一定是上次读的时候没有读完的,这里要注意这一次读也不一定把这一行读取完了,所以要循环处理
lines[-1] += newlines[0] # 所以把这一行和上次读的最后一行连接在一起
elif len(newlines) > 1: # 如果读取到的内容超过一行,和上面一样这一次读也不一定把最后一行读取完了,所以要循环处理
lines[-1] += newlines[0] # 那第一行一定是上一次没有读取完的后半部分,直接加在一起就行了
lines.extend(newlines[1:]) # 把新读取到的其它行加入到前面已经读取了的列表中,这个地方用extend效率要高于用+号连接,不过后面的切片的效率可能不好,不知道有更好的办法没有
for line in lines:
item = logline2item(line) # 把当前这一行日志中我们关心的内容用正规分析出来,并存在item这个新的对象中
if not item:
continue
dealitem(item) # 对这个item对象进行处理
time.sleep(1) # 等1秒钟,然后再去读取新产生的日志 |
程序这么写不知道有什么问题没有?而且即使这样能解决,也不知道有更好的方法没有。
[ 本帖最后由 gnujava 于 2009-8-10 23:28 编辑 ] |
|