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

发布于 2024-11-29 14:39:53 字数 469 浏览 1 评论 0原文

我试图重复读取系统日志,并且只从上次读取的位置开始。我试图将tell() 的位置保存为一个单独的文件,并在每次读取之前重新加载以进行查找。



    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()


I am trying to read a syslog repeatedly and only start from the point I left off last read. I am trying to save the location of tell() is a sperate file and reload to seek before every read.



    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()


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

执手闯天涯 2024-12-06 14:39:53
  1. 写成str(last_loc)而不是last_loc

    其余的可能是可选的。

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

    <前><代码>尝试:
    使用 open("location.file") 作为 lf:
    s = lf.read()
    最后位置 = int(s)
    除了:
    最后发布= 0

    将 open("/var/log/messages") 作为 sl:
    sl.seek(last_pos)
    对于 sl 中的行:
    # 这应该是上次读取的起点
    最后一个位置 = sl.tell()

    使用 open("location.file", "w") 作为 lf:
    lf.write(str(last_loc))

  1. Write str(last_loc) instead of last_loc.

    The rest are probably optional.

  2. Use w instead of w+ for writing the location.
  3. Close /var/log/messages when you're done with it.
  4. Depending on your version of Python (definitely on 2.6 or newer, maybe on 2.5 depending), you may want to use with to automatially close files.
  5. You probably don't need strip if you're just writing the value.
  6. You can just use read instead of readline on lf.
  7. You can iterate over the file itself, rather than using readlines, for 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))
    
羁客 2024-12-06 14:39:53

你的阅读路线很奇怪。您需要做的是:

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

lf.write(str(last_loc))

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

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

Your readline is weird. What you nee to do is either:

1) save the value as a string and parse it:

lf.write(str(last_loc))

2) save and reread the location as an int:

lf.write(struct.pack("Q",lf.tell()))
last_pos = struct.unpack("Q",lf.read())
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文