我在日志文件中以这种格式编写了一个矩阵:
2014-09-08 14:10:20,107 - root - INFO - [[ 8.30857546 0.69993454 0.20645551
77.01797674 13.76705776]
[ 8.35205432 0.53417203 0.19969048 76.78598173 14.12810144]
[ 8.37066492 0.64428449 0.18623849 76.4181809 14.3806312 ]
[ 8.50493296 0.5110043 0.19731849 76.45838604 14.32835821]
[ 8.18900791 0.4955451 0.22524777 76.96966663 14.12053259]]
...some text
2014-09-08 14:12:22,211 - root - INFO - [[ 3.25142253e+01 1.11788106e+00 1.51065008e-02 6.16496299e+01
4.70315726e+00]
[ 3.31685887e+01 9.53522041e-01 1.49767860e-02 6.13449154e+01
4.51799710e+00]
[ 3.31101827e+01 1.09729703e+00 5.03347259e-03 6.11818594e+01
4.60562742e+00]
[ 3.32506957e+01 1.13837592e+00 1.51783456e-02 6.08651657e+01
4.73058437e+00]
[ 3.26809490e+01 1.06617279e+00 1.00110121e-02 6.17429172e+01
4.49994994e+00]]
我正在使用 python 日志记录包编写这个矩阵:
logging.info(conf_mat)
但是,logging.info 没有向我展示以 float %.3f 格式编写矩阵的方法。所以我决定这样解析日志文件:
conf_mat = [[]]
cf = '[+-]?(?=\d*[.eE])(?=\.?\d)\d*\.?\d*(?:[eE][+-]?\d+)?'
with open(sys.argv[1]) as f:
for line in f:
epoch = re.findall(ep, line) # find lines starting with epoch for other stuff
if epoch:
error_line = next(f) # grab the next line, which is the error line
error_value = error_line[error_line.rfind('=')+1:]
data_points.append(map(float,epoch[0]+(error_value,))) #get the error value for the specific epoch
for i in range(N):
cnf_mline = next(f)
match = re.findall(cf, cnf_mline)
if match:
conf_mat[count].append(map(float,match))
else:
conf_mat.append([])
count += 1
但是,当我尝试使用转换矩阵时,正则表达式在查看矩阵时不会捕获行中的中断
conf_mtx = np.array(conf_mat)
最佳答案
您的正则表达式字符串 cf
需要是原始字符串文字:
cf = r'[+-]?(?=\d*[.eE])(?=\.?\d)\d*\.?\d*(?:[eE][+-]?\d+)?'
为了正常工作。反斜杠\字符被解释为“常规”字符串中的转义序列,但不应出现在正则表达式中。您可以在re
module's documentation顶部阅读有关原始字符串文字的信息。 ,并且在这个优秀的SO answer 。 Alex Martelli 解释得很好,所以我不会在这里重复他所说的一切。我只想说,如果你不使用原始文字,你就必须用另一个反斜杠转义每一个反斜杠,而这很快就会变得丑陋和烦人。
至于代码的其余部分,如果没有更多信息,它将无法运行。 for i in range(N):
中的 N
未定义,几行后的 count
也是如此。调用 cnf_mline = next(f) 确实没有任何意义,因为您将在之前用完文件中的行(通过重复调用 next)您可以使用 for line in f:
命令迭代所有这些。目前尚不清楚您的数据是否确实在后半部分有换行符,其中列表的一个成员位于下一行,我认为由于 next
尝试就是这种情况。
我认为您应该首先尝试将输入文件清理为常规范式,然后您将可以更轻松地在其上运行正则表达式。为了处理后续行并且不过度使用 next()
来运行生成器表达式,请查看 itertools.tee()
。它从单个迭代返回n个独立的生成器,允许您将第二个生成器向前移动到第一个生成器之前。或者,您可以将文件的行读入列表中,然后仅使用 i, i+1 的索引进行操作。只需剥离
每一行,将它们连接
在一起,然后写入新文件或列表。然后,您可以继续重写匹配循环,以简单地拉出适当格式的每个数字并将其插入到矩阵的正确位置。好消息是你的正则表达式捕获了我向它抛出的所有内容,因此你不需要在那里修改任何内容。
祝你好运!
关于python - 从日志文件转换矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25903120/