在Python中每天创建一个日志文件

2 投票
4 回答
6565 浏览
提问于 2025-04-18 06:14

我想用Python写一个脚本,每天生成一个日志文件。这个日志文件会记录GPS信息,文件格式是gpx(我已经有这个格式的脚本了)。所以今天它会创建一个名为12-05-2014.gpx的文件,里面会保存所有的GPS记录,直到变成13-05-2014。然后它会创建一个新的文件13-05-2014.gpx,并继续在里面记录。这样做可以吗?能给我一些提示吗?

4 个回答

0

这一行代码:

self._file = open(self._format_filename())

应该改成:

self._file = open(self._format_filename(), self_mode)

这样做会创建一个新文件并且可以往里面写东西。如果不加 'self_mode',文件虽然会被创建,但不能用来写入内容。

0

对之前提供的代码做个补充:

文件需要以追加模式打开。在Windows和Raspbian系统上,这样做不起作用,所以我把这一行:

self._file = open(self._filename)

改成了:

self._file = open(self._filename, self._mode)

希望这能帮助到某些人,让他们能更好地使用这个。

GWS

2

可能大概是这样的:

import time
datafile = open('mydatafile')
while True:
        filename = str(time.strftime("%d-%m-%Y"))+'.gpx'
        with open(filename, 'w') as myfile:
                myfile.write(datafile.read())
        time.sleep(60)

你可以使用 time 这个模块来获取当前时间,然后把这个时间当作文件名。接着,每分钟更新一下这个文件名,把 datafile 的内容写进去。当然,你可能需要根据自己的情况调整一下这段代码,因为每个人的情况都不一样。

4

注意:我理解你是在扩展一个已经存在的Python脚本,这个脚本处理你的GPS日志。如果不是的话,@aj8uppal可能说得对。

我建议你使用日志模块来输出你的数据,并利用RotatingFileHandler,这个工具可以帮你自动处理日志文件。再加上Formatter类,你就可以充分利用日志模块来实现日志的轮换。

不过,如果你觉得Python的日志模块不适合你——虽然我认为这是最好的选择,你也可以在你的程序中使用以下的写入函数:

import os
import time

class RotatingFileOpener():
    def __init__(self, path, mode='a', prepend="", append=""):
        if not os.path.isdir(path):
            raise FileNotFoundError("Can't open directory '{}' for data output.".format(path))
        self._path = path
        self._prepend = prepend
        self._append = append
        self._mode = mode
        self._day = time.localtime().tm_mday
    def __enter__(self):
        self._filename = self._format_filename()
        self._file = open(self._filename, self._mode)
        return self
    def __exit__(self, *args):
        return getattr(self._file, '__exit__')(*args)
    def _day_changed(self):
        return self._day != time.localtime().tm_mday
    def _format_filename(self):
        return os.path.join(self._path, "{}{}{}".format(self._prepend, time.strftime("%Y%m%d"), self._append))
    def write(self, *args):
        if self._day_changed():
            self._file.close()
            self._file = open(self._format_filename())
        return getattr(self._file, 'write')(*args)
    def __getattr__(self, attr):
        return getattr(self._file, attr)
    def __iter__(self):
        return iter(self._file)

你可以这样使用:

with RotateFileOpener('/var/log/gps', prepend='gps_data-', append='.gpx') as logger:
    while True:
        log = get_gpx_data()
        logger.write(log)

这将会写入到/var/log/gps

/var/log/gps/gps_data-20140512.gpx
/var/log/gps/gps_data-20140513.gpx
/var/log/gps/gps_data-20140514.gpx
…

撰写回答