相关疑难解决方法(0)

使用Python获取文件的最后n行,类似于tail

我正在为Web应用程序编写一个日志文件查看器,为此我想通过日志文件的行分页.文件中的项目是基于行的,底部是最新项目.

所以我需要一种tail()方法,可以n从底部读取行并支持偏移量.我想出的是这样的:

def tail(f, n, offset=0):
    """Reads a n lines from f with an offset of offset lines."""
    avg_line_length = 74
    to_read = n + offset
    while 1:
        try:
            f.seek(-(avg_line_length * to_read), 2)
        except IOError:
            # woops.  apparently file is smaller than what we want
            # to step back, go to the beginning instead
            f.seek(0)
        pos = f.tell()
        lines = f.read().splitlines()
        if len(lines) >= to_read or pos == 0:
            return lines[-to_read:offset and -offset or None]
        avg_line_length …
Run Code Online (Sandbox Code Playgroud)

python file-io file tail logfiles

174
推荐指数
10
解决办法
14万
查看次数

在没有轮询的情况下检测文件更改

我正在尝试使用Python程序中的方法来检测文件系统上的文件是否已被修改.我知道我可以在每5秒运行一次以检查系统的最后修改日期,但我很好奇是否有更简单的方法来执行此操作,而无需要求我的程序重复检查.

有谁知道这样的方法?

python

62
推荐指数
4
解决办法
6万
查看次数

监控文件/目录的内容?

我正在寻找一个跨平台文件监控python包?我知道可以使用pywin32监视windows上的文件,并且有些软件包可以在Linux/Unix上运行,但是有人知道跨平台的吗?

python filesystems monitoring cross-platform file

56
推荐指数
2
解决办法
8万
查看次数

python watchdog监视文件的变化

伙计们,我需要查看日志文件以进行更改.在查看了stackoverflow问题之后,我看到人们推荐"看门狗".所以我正在尝试测试,并且不确定在文件更改时添加代码的位置:

#!/usr/bin/python
import time
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

if __name__ == "__main__":
    event_handler = LoggingEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path='.', recursive=False)
    observer.start()
    try:
        while True:
            time.sleep(1)
        else:
            print "got it"
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
Run Code Online (Sandbox Code Playgroud)

如果文件已被添加/更改,我在哪里添加"得到它",在while循环中?

python monitoring file watchdog

50
推荐指数
2
解决办法
5万
查看次数

如何查看目录以进行更改?

在python核心中找不到任何东西来做这件事.任何人都可以推荐一个库或"电池"来做到这一点?理想情况下,我希望这是可移植的,但如果它只适用于Unix(我的服务器),那就没关系.

python filesystemwatcher

21
推荐指数
2
解决办法
6万
查看次数

热插拔Python运行程序

以下代码允许您修改runtime.py运行时的内容.换句话说,您不必中断runner.py.

#runner.py
import time
import imp

def main():
    while True:
        mod = imp.load_source("runtime", "./runtime.py")
        mod.function()
        time.sleep(1)

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

在运行时导入的模块是:

# runtime.py
def function():
    print("I am version one of runtime.py")
Run Code Online (Sandbox Code Playgroud)

这种原始机制允许您"如何交换"Python代码(la Erlang).还有更好的选择吗?

请注意,这只是一个学术问题,因为我没有必要做这样的事情.但是,我有兴趣了解有关Python运行时的更多信息.

编辑:

我创建了以下解决方案:一个Engine对象提供了一个模块中包含的函数的接口(在这种情况下,模块被调用engine.py).该Engine对象还生成一个线程,用于监视源文件中的更改,如果检测到更改,则会调用notify()引擎上的方法,该方法会重新加载源文件.

在我的实现中,更改检测基于每秒frequency检查文件的SHA1校验和的轮询,但是其他实现也是可能的.

在此示例中,检测到的每个更改都会记录到已调用hotswap.log校验和的文件中.

用于检测改变的其他机制可以是服务器或使用inotify中的Monitor线程.

import imp
import time
import hashlib
import threading
import logging

logger = logging.getLogger("")

class MonitorThread(threading.Thread):
    def __init__(self, engine, frequency=1): …
Run Code Online (Sandbox Code Playgroud)

python hotswap

18
推荐指数
2
解决办法
7814
查看次数

如何"观察"文件以进行修改/更改?

当我指定的文件被修改时,我想调用我的chromefirefox浏览器.我怎么能"监视"该文件在修改后做某事?

程序上似乎步骤是..基本上每隔一秒左右设置一个永不停止的间隔,并缓存初始修改日期,然后每隔一秒比较日期,当它改变调用X.

python linux

12
推荐指数
2
解决办法
2万
查看次数

如何在python中检查文件夹中的文件是否已更改?

我需要在python中知道每当在特定目录中添加/删除/修改新文件时有没有办法呢?我正在寻找一种类似"inofity"的功能(来自POSIX).

谢谢

python inotify

12
推荐指数
3
解决办法
2万
查看次数

使用asyncio监视文件

我正在尝试使用Python的asyncio库来确定一种观察文件外观的好方法.这是我到目前为止所提出的:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""Watches for the appearance of a file."""

import argparse
import asyncio
import os.path


@asyncio.coroutine
def watch_for_file(file_path, interval=1):
    while True:
        if not os.path.exists(file_path):
            print("{} not found yet.".format(file_path))
            yield from asyncio.sleep(interval)
        else:
            print("{} found!".format(file_path))
            break


def make_cli_parser():
    cli_parser = argparse.ArgumentParser(description=__doc__)
    cli_parser.add_argument('file_path')
    return cli_parser


def main(argv=None):
    cli_parser = make_cli_parser()
    args = cli_parser.parse_args(argv)
    loop = asyncio.get_event_loop()
    loop.run_until_complete(watch_for_file(args.file_path))

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

我把它保存为watch_for_file.py,并可以运行它

python3 watch_for_file.py testfile
Run Code Online (Sandbox Code Playgroud)

在另一个shell会话中,我发布

touch testfile
Run Code Online (Sandbox Code Playgroud)

结束循环.

有没有比使用这个无限循环更优雅的解决方案yield …

python python-3.x python-asyncio

11
推荐指数
1
解决办法
4644
查看次数

如何通知在不同进程中完成的SQLite数据库更改过程?

假设我有两个或更多处理SQLite数据库的进程 - 一个"播放器"进程和许多"编辑器"进程.

"播放器"进程读取数据库并更新视图 - 在我的情况下,根据存储在数据库中的事件,它将是混合到声卡的波形.

"编辑器"进程是该数据库的任何编辑器:它不断地更改数据库.

现在我希望播放器快速反映编辑更改.

我知道SQLite提供了钩子来跟踪同一进程中的数据库更改,但似乎没有关于如何使用多个进程执行此操作的信息.

我可以不断地轮询数据库,比较记录和触发事件,但这似乎效率很低,特别是当数据库增长到很大的时候.

我正在考虑使用日志表和触发器,但我想知道是否有一个更简单的方法.

python sqlite notifications

10
推荐指数
2
解决办法
9248
查看次数