用大熊猫读取日志文件



我有一个日志文件,我尝试使用read_csv或read_table在pandas中读取该文件。我有一个结果的示例:

0    date=2015-09-17    time=21:05:35     duration=0    etc...

在1列上。

我想拆分每一行,取名称(例如日期,时间,...),然后将它们转换为列,以便我得到:

          date           time     duration   ...
  0    2015-09-17      21:05:35      0              

谢谢!

我知道这是一个旧文章,但是我遇到了同样的问题并找到了解决方案。错误Expected n fields in line n, saw n可能是由于每行具有不同数量的列。如果每行的列排序不同,则此方法也不好。我在这里写了一个示例代码,该代码将您的日志转换为JSON,然后转换为Pandas DataFrame。

import pandas as pd
import json
path='log_sample.log'
log_data=open(path,'r')
result={}
i=0
for line in log_data:
    columns = line.split('') #or w/e you're delimiter/separator is
    data={}
    for c in columns:
        key = c.split('=')[0]
        value=c.split('=')[1]
        data[key]=value
    result[i]=data
    i+=1
j=json.dumps(result)
df=pd.read_json(j, orient='index')

----- 编辑答案以说明不一致的间距:

不确定Pythonic方法应该是什么,但这是一种可以起作用的方法。

以OP的数据样本为例:

0    date=2015-09-17    time=21:05:35     duration=0
1    date=2015-09-17    time=21:05:36     duration=0
2    date=2015-09-17    time=21:05:37     duration=0
3    date=2015-09-17    time=21:05:38     duration=0
4    date=2015-09-17    time=21:05:39     duration=0
5    date=2015-09-17    time=21:05:40     duration=0

i循环穿过每一行,在等号上拆分,然后抓住所需的文本:

import pandas as pd
log_data  = open('log_sample.txt', 'r')
split_list = []
for line in log_data:
    thing1 = line.split('=')
    #print(thing1)
    date = thing1[1][:10]
    time = thing1[2][:8]
    dur = thing1[3]
    split_list.append([date, time, dur])
df = pd.DataFrame(split_list, columns=['date', 'time', 'duration'])
df

----- 第一个答案:

正如@jezrael在评论中提到的,您可以利用read_csv中的" sep"参数。

pd.read_csv('test.txt', sep=r'\t', engine='python') #[1]

请参阅:

  • [1] python pandas read_csv在选项卡中未识别 t delemited文件
  • https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

最新更新