如何从最后一个位置重复读取文件

时间:2011-08-14 05:17:57

标签: python file file-io

我正在尝试重复读取一个系统日志,并且只从我上次读取的那一点开始。我试图保存tell()的位置是一个sperate文件,并在每次读取之前重新加载以进行搜索。



    lf = open("location.file", 'r')
    s = lf.readline()
    last_pos = int(s.strip())
    lf.close()

    sl = open("/var/log/messages", 'r')
    sl.seek(last_pos)
    for line in sl.readlines():
         # This should be the starting point from the last read
    last_loc = sl.tell()

    lf = open("location.file", "w+")
    lf.write(last_loc)
    lf.close()


2 个答案:

答案 0 :(得分:3)

  1. 撰写str(last_loc)代替last_loc

    其余的可能是可选的。

  2. 使用w代替w+来撰写位置。
  3. 完成后关闭/var/log/messages
  4. 根据您的Python版本(绝对是2.6或更高版本,可能取决于2.5),您可能希望使用with自动关闭文件。
  5. 如果你只是写这个值,你可能不需要strip
  6. 您可以在read上使用readline代替lf
  7. 您可以为readlines迭代文件本身,而不是使用sl

    try:
        with open("location.file") as lf:
            s = lf.read()
            last_pos = int(s)
    except:
        last_post = 0
    
    with open("/var/log/messages") as sl:
        sl.seek(last_pos)
        for line in sl:
            # This should be the starting point from the last read
        last_loc = sl.tell()
    
    with open("location.file", "w") as lf:
        lf.write(str(last_loc))
    

答案 1 :(得分:0)

你的readline很奇怪。你要做的是:

1)将值保存为字符串并解析它:

lf.write(str(last_loc))

2)保存并重新读取位置为int:

lf.write(struct.pack("Q",lf.tell()))
last_pos = struct.unpack("Q",lf.read())