事情是这样,我在用python自带的logging.FileHandler,输出logging记录,主要是记录主力合约切换的。很简单。

就是用米筐的get_dominant或者聚宽的get_dominant_future去查询一段时间品种的主力合约,返回的都是是日期为index,合约名称为值的Pandas.Series。这里可以用 Series自带的drop_duplicates(), 如果返回一个主力合约,说明没有切换;如果返回为2说明有切换,次数可以读取一个值的index作为切换日期输出到log文件备注。

def check_dominant(symbol,startdate,enddate) -> str:
   """
   传入合约名日期,返回str
   :param symbol:
   :return:
   """
   dominant_symbol_list = rq.get_dominant(symbol.upper(),startdate,enddate)
   if dominant_symbol_list is not None:
      last_symbol_series = dominant_symbol_list.tail(self.check_days+1).drop_duplicates()
      if len(last_symbol_series)>1:
         strLen = f"请注意 在{list(last_symbol_series.index)[-1]}日,({symbol})主力合约切换: {last_symbol_series[-2]} -> {last_symbol_series[-1]}. "
         logger.info(strLen)

本来很平常一段使用,但是在log文件时往下写入,就是查询必须滚动到最下。如果很多,还真是麻烦。想有没有方法逆序写入log文档,最新的放在最上面;搜索logging文档和stackflow讨论;基本方案继承FileHandler重写写入文档方法,因为从头插入文件效率太低了,并不鼓励。

后面想想就找个笨方法吧,每次输出保存后,在按行读取反转从写一个逆序的log;自己写了些代码实现,感觉实在笨拙。无意搜索到一段简洁明了的python代码,感觉实在明了,可以算是pythonic code。分享如下:

with open(filename_sequence) as f, open(filename) as fout:
   fout.writelines(reversed(f.readlines()))