解析标有 ANSI 颜色转义序列的数据
parsing data tagged with ANSI color escape sequences
需要帮助来转换日志文件,其中的数据用 ANSI 颜色转义序列和日期时间戳标记。以下是文本中行的格式:
'\x1b[34m[SOME_INFO]\x1b[0m \x1b[36m[SOME_OTHR_INFO]\x1b[0m Thu Sep 09 00:59:12 XST some variable length message which might contain commas (,), etc.'
我在一个几乎无法访问 Internet 并使用 Python 2.7 的孤立网络上。
我浪费了几个小时:(。我最接近的是使用@Elliot Chance 的解决方案
re.sub(r'\x1b\[[\d;]+m', '', s)
这里Filtering out ANSI escape sequences提供如下:
t = re.sub(r'\x1b\[[\d;]+m', '~', s)
re.split(r'~|(Mon|Tue|Wed|Thu|Fri|Sat|Sun.*?\d{4})', t)
这并没有给我我想要的。
以上代码的输出:
['',
None,
'[SOME_INFO]',
None,
' ',
None,
'[SOME_OTHR_INFO]',
None,
' ',
'Thu',
' Sep 09 00:59:12 XST some variable length message which might contain commas (,), etc.']
我要找的输出如下:
'SOME_INFO, SOME_OTHR_INFO, Thu Sep 09 00:59:12 XST, some variable length message which might contain commas (,), etc.
有没有办法使用 pandas.read_csv()
或类似方法将数据加载到 pandas 数据帧?
注意:每一行都以转义码开头,但每一行中可以有可变字段(即,
SOME_INFO, SOME_OTHR_INFO, ANOTHER_INFO, etc. followed by the timestamp followed by free text).
以下为我完成了工作:
import re
import pandas as pd
def split_line(s):
t = re.sub(r'\x1b\[[\d]+m', '~', s) #assume ~ is not present in the free text field
t = re.sub('~\s+~|~\s+), '~', s)
return filter(None, re.split('~|(\D{3}\s\D{3}\s\d{2}.*\d{4})\s+', t))
后续步骤:
- 使用
将文件读入单列数据帧
df = pd.read_csv(file_name, header=None, sep='\n', engine='python', index_col=False)
- 将上述函数应用于上面数据框的每一行。我在应用
pd.apply()
时遇到了问题,所以我最终改用了列表理解方法
col_names = ['A', 'B', 'C', 'D']
df = pd.DataFrame([split_line(str(s)) for s in df[0], columns=col_names]
df.head()
- 最后使用
df.to_csv()
将文件写入 csv
需要帮助来转换日志文件,其中的数据用 ANSI 颜色转义序列和日期时间戳标记。以下是文本中行的格式:
'\x1b[34m[SOME_INFO]\x1b[0m \x1b[36m[SOME_OTHR_INFO]\x1b[0m Thu Sep 09 00:59:12 XST some variable length message which might contain commas (,), etc.'
我在一个几乎无法访问 Internet 并使用 Python 2.7 的孤立网络上。
我浪费了几个小时:(。我最接近的是使用@Elliot Chance 的解决方案
re.sub(r'\x1b\[[\d;]+m', '', s)
这里Filtering out ANSI escape sequences提供如下:
t = re.sub(r'\x1b\[[\d;]+m', '~', s)
re.split(r'~|(Mon|Tue|Wed|Thu|Fri|Sat|Sun.*?\d{4})', t)
这并没有给我我想要的。 以上代码的输出:
['',
None,
'[SOME_INFO]',
None,
' ',
None,
'[SOME_OTHR_INFO]',
None,
' ',
'Thu',
' Sep 09 00:59:12 XST some variable length message which might contain commas (,), etc.']
我要找的输出如下:
'SOME_INFO, SOME_OTHR_INFO, Thu Sep 09 00:59:12 XST, some variable length message which might contain commas (,), etc.
有没有办法使用 pandas.read_csv()
或类似方法将数据加载到 pandas 数据帧?
注意:每一行都以转义码开头,但每一行中可以有可变字段(即,
SOME_INFO, SOME_OTHR_INFO, ANOTHER_INFO, etc. followed by the timestamp followed by free text).
以下为我完成了工作:
import re
import pandas as pd
def split_line(s):
t = re.sub(r'\x1b\[[\d]+m', '~', s) #assume ~ is not present in the free text field
t = re.sub('~\s+~|~\s+), '~', s)
return filter(None, re.split('~|(\D{3}\s\D{3}\s\d{2}.*\d{4})\s+', t))
后续步骤:
- 使用 将文件读入单列数据帧
df = pd.read_csv(file_name, header=None, sep='\n', engine='python', index_col=False)
- 将上述函数应用于上面数据框的每一行。我在应用
pd.apply()
时遇到了问题,所以我最终改用了列表理解方法
col_names = ['A', 'B', 'C', 'D']
df = pd.DataFrame([split_line(str(s)) for s in df[0], columns=col_names]
df.head()
- 最后使用
df.to_csv()
将文件写入 csv