Python 3.x 用python读取数据

Python 3.x 用python读取数据,python-3.x,Python 3.x,我有以下格式的日志数据: TIMESTAMP="Jun 7 2010 15:03:49 NZST" ACCESS-TYPE="ABC" TYPE="XYZ" PACKET- TYPE="St" REASON="bkz" CIRCUIT-ID="UIX eth 1/1/11/20" REMOTE-ID="NBC" CALLING- STATION-ID="LKP" SUB-ID="JIK" 如何使用Python将其理解为正确的数据帧(行和列)。 其中列名将是TIMESTAMP、ACCESS-T

我有以下格式的日志数据:

TIMESTAMP="Jun  7 2010 15:03:49 NZST" ACCESS-TYPE="ABC" TYPE="XYZ" PACKET-
TYPE="St" REASON="bkz" CIRCUIT-ID="UIX eth 1/1/11/20" REMOTE-ID="NBC" CALLING-
STATION-ID="LKP" SUB-ID="JIK"
如何使用Python将其理解为正确的数据帧(行和列)。 其中列名将是TIMESTAMP、ACCESS-TYPE等等


这只是数据中的一个示例行。

您可以
re
将每行拆分为元组列表或dict。您可以使用它填充数据帧

def parse_logfile(log_file_handle):
    p = re.compile(r'\s*(.*?)="(.*?)"', )
    for line in log_file_handle:
        yield p.findall(line)
对于您发布的行,这将产生

[('TIMESTAMP', 'Jun  7 2010 15:03:49 NZST'),
 ('ACCESS-TYPE', 'ABC'),
 ('TYPE', 'XYZ'),
 ('PACKET-TYPE', 'St'),
 ('REASON', 'bkz'),
 ('CIRCUIT-ID', 'UIX eth 1/1/11/20'),
 ('REMOTE-ID', 'NBC'),
 ('CALLING-STATION-ID', 'LKP'),
 ('SUB-ID', 'JIK')]
因此,在代码的另一部分中,您可以执行如下操作

with open(log_filename, 'r') as log_file_handle:
    log_lines = parse_logfile(log_file_handle)

    df = pd.DataFrame()
    for line in log_lines:
        df = df.append(dict(line), ignore_index=True, )
测试数据

因此,我更改了时间戳和访问类型,第二个条目是
access-TYPE1
,而不是
access-TYPE

结果


如果所有行具有相同顺序的相同键,则追加应该很容易。如果在整个文件中都发生更改,这可能会变得更加困难。你能多发几行吗

这是一个使用pyparsing创建小型解析器的简单示例:

import pyparsing as pp

key = pp.Word(pp.alphas, pp.alphas+'-')
EQ = pp.Literal('=').suppress()
value = pp.QuotedString('"')
parser = pp.Dict(pp.OneOrMore(pp.Group(key + EQ + value)))

使用<代码>分析器< /代码>解析您的输入数据(将单独的行连接为一个,因为您的示例输入中断了键中间的一些行):

要获得结果,请使用dict或属性表示法访问结果,或调用dump()查看键和结构

print(result['PACKET-TYPE'])
print(list(result.keys()))
print(result.TYPE)
print("{TIMESTAMP}/{ACCESS-TYPE}/{CALLING-STATION-ID}".format(**result))
print(result.dump())
印刷品:

St
['PACKET-TYPE', 'SUB-ID', 'REASON', 'CALLING-STATION-ID', 'ACCESS-TYPE', 'CIRCUIT-ID', 'REMOTE-ID', 'TYPE', 'TIMESTAMP']
XYZ
Jun  7 2010 15:03:49 NZST/ABC/LKP
[['TIMESTAMP', 'Jun  7 2010 15:03:49 NZST'], ['ACCESS-TYPE', 'ABC'], ['TYPE', 'XYZ'], ['PACKET-TYPE', 'St'], ['REASON', 'bkz'], ['CIRCUIT-ID', 'UIX eth 1/1/11/20'], ['REMOTE-ID', 'NBC'], ['CALLING-STATION-ID', 'LKP'], ['SUB-ID', 'JIK']]
- ACCESS-TYPE: 'ABC'
- CALLING-STATION-ID: 'LKP'
- CIRCUIT-ID: 'UIX eth 1/1/11/20'
- PACKET-TYPE: 'St'
- REASON: 'bkz'
- REMOTE-ID: 'NBC'
- SUB-ID: 'JIK'
- TIMESTAMP: 'Jun  7 2010 15:03:49 NZST'
- TYPE: 'XYZ'

提供更多信息。您的输出应该是“正确的数据帧”?你想要本字典吗?有序词典?矩阵?还有别的吗?没有。正确的数据框,行和列。。。就像电子表格一样。当我调用函数“parse_logefile(“D:/PC1/Data_folder/sample.log”)时,我没有得到任何输出。它显示“生成器对象解析日志文件在0x000000FEC1D8DAF0>”,这是因为它是。你可以读一些关于geenrators的书,也可以读到。现在,如何将此输出数据以数据帧格式转换为csv文件。我已将数据添加到列表中。。现在如何将其转换为数据帧(行和列)?我添加了代码以将其转换为数据帧。冒号的排序不同,但可以使用
reindex
进行反求。
sample = """\
TIMESTAMP="Jun  7 2010 15:03:49 NZST" ACCESS-TYPE="ABC" TYPE="XYZ" PACKET-
TYPE="St" REASON="bkz" CIRCUIT-ID="UIX eth 1/1/11/20" REMOTE-ID="NBC" CALLING-
STATION-ID="LKP" SUB-ID="JIK" """
sample = ''.join(sample.splitlines())

# parse the input string
result = parser.parseString(sample)
print(result['PACKET-TYPE'])
print(list(result.keys()))
print(result.TYPE)
print("{TIMESTAMP}/{ACCESS-TYPE}/{CALLING-STATION-ID}".format(**result))
print(result.dump())
St
['PACKET-TYPE', 'SUB-ID', 'REASON', 'CALLING-STATION-ID', 'ACCESS-TYPE', 'CIRCUIT-ID', 'REMOTE-ID', 'TYPE', 'TIMESTAMP']
XYZ
Jun  7 2010 15:03:49 NZST/ABC/LKP
[['TIMESTAMP', 'Jun  7 2010 15:03:49 NZST'], ['ACCESS-TYPE', 'ABC'], ['TYPE', 'XYZ'], ['PACKET-TYPE', 'St'], ['REASON', 'bkz'], ['CIRCUIT-ID', 'UIX eth 1/1/11/20'], ['REMOTE-ID', 'NBC'], ['CALLING-STATION-ID', 'LKP'], ['SUB-ID', 'JIK']]
- ACCESS-TYPE: 'ABC'
- CALLING-STATION-ID: 'LKP'
- CIRCUIT-ID: 'UIX eth 1/1/11/20'
- PACKET-TYPE: 'St'
- REASON: 'bkz'
- REMOTE-ID: 'NBC'
- SUB-ID: 'JIK'
- TIMESTAMP: 'Jun  7 2010 15:03:49 NZST'
- TYPE: 'XYZ'