我想在python中编写一个脚本,它将记录一个文件,每天一个。 它将记录gps记录,日志文件将是一个gpx(我有脚本)。 因此,今天它将创建一个名为12-05-2014.gpx的文件,并将保留所有gps记录,直到它变为13-05-2014。然后它将创建一个新文件13-05-2014.gpx并继续登录。 这可能吗?你可以给我一些提示吗?
答案 0 :(得分:3)
N.B。:我理解您正在扩展处理GPS日志的现有python脚本。如果没有,@ 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
…
答案 1 :(得分: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
的内容写入该文件名。当然,您可能需要更改此代码,因为对您来说一切都不一样。
答案 2 :(得分:0)
除了提供的代码:
需要在追加模式下打开文件。在Windows和Rapsbian上,这不起作用,我不得不改变这一行: self._file = open(self._filename)
成: self._file = open(self._filename,self._mode)
希望这有助于某人充分利用这一点。
GWS
答案 3 :(得分:0)
这一行:
self._file = open(self._format_filename())
应该是:
self._file = open(self._format_filename(), self_mode)
这将创建一个新文件并写入它。没有添加' self_mode'文件已创建,但不会打开进行写作。