【问题标题】:Pandas: load records that span multiple linesPandas:加载跨越多行的记录
【发布时间】:2018-07-05 17:41:25
【问题描述】:

我正在寻找将日志文件中的两种常见模式加载到 pandas 数据帧中的标准 pythonic 方法。

跨越多行的记录:

=REPORT==== 26-Jun-2018::18:30:00 ===
    column_1: some data
    column_2: {'maybe': 'json or something'}

=REPORT==== 26-Jun-2018::19:30:00 ===
    column_1: some data
    column_2: {'maybe': 'json or something',
               'and': 'maybe spanning multiple lines'}

可能跨越多行的记录:

2018-01-09 20:12:38,020 INFO logname: Examining 6668121 database
2018-01-09 20:13:00,020 ERROR logname: Caught an Exception
    Traceback (most recent call last):
    File "test.py", line 1, in __main__
        None.do_the_thing()
    AttributeError: 'NoneType' object has no attribute 'getDatabase'

对于第一个示例,我希望得到一个包含 ['timestamp', 'column_1', 'column_2'] 等列的数据框

对于第二个,['timestamp', 'log_level', 'logname', 'message text']

我很确定有一种方法可以为每条记录表示分隔符,而不仅仅是每行的末尾,以及每条记录的内部分隔符。

【问题讨论】:

    标签: python pandas logging


    【解决方案1】:

    我不认为 pandas 确实有一种开箱即用的方式来完成你想要的。

    以下是从Doc on pandas I/O methods 读取数据帧的可用方法:

    Format Type   Data Description    Reader      Writer
    text          CSV                 read_csv    to_csv
    text          JSON                read_json   to_json
    text          HTML                read_html   to_html
    text          Local clipboard     read_clipboard  to_clipboard
    binary        MS Excel            read_excel  to_excel
    binary        HDF5 Format         read_hdf    to_hdf
    binary        Feather Format      read_feather    to_feather
    binary        Parquet Format      read_parquet    to_parquet
    binary        Msgpack             read_msgpack    to_msgpack
    binary        Stata               read_stata      to_stata
    binary        SAS                 read_sas     
    binary        Python Pickle Format    read_pickle to_pickle
    SQL           SQL                 read_sql    to_sql
    SQL           Google Big Query    read_gbq    to_gbq
    

    您的两个示例都不遵循文本格式的规则:csv、html 或 json - 它们是多种格式的混搭。更复杂的是,您的元素分隔符和行分隔符都因行而异。

    来自read_csv doc

    如果您想要使用正则表达式的复杂列分隔符,那么这会强制 pandas 使用 python 引擎:

    sep : str, 默认‘,’

    要使用的分隔符。 [...]此外,分隔符长于 1 个字符且不同于 '\s+' 将被解释为常规字符 表达式,并且还将强制使用 Python 解析引擎。 请注意,正则表达式分隔符容易忽略引用的数据。正则表达式 例如:'\r\t'

    lineterminator arg 只能与 C 解析器一起使用,并且不能是正则表达式:

    lineterminator : str (length 1), 默认无

    将文件分成几行的字符。仅对 C 解析器有效。

    您可能无法编写自己的解析器,这并不理想,因为这样很容易出错。

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 1970-01-01
      • 2017-11-05
      • 2018-02-03
      • 2012-12-15
      • 2014-06-14
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多