Мне нужно прочитать журнал доступа tomcat, в котором есть такие строки:
[06/Nov/2020:00:43:04 +0200] /wsi/services/ServicesReadRequest 2265 10.101.101.101 200 21
пытаясь прочитать файл как csv, установив все столбцы как строковый тип
import pandas as pd
headers = ['Timestamp', 'Command', 'IPAddr', 'Blank01', 'Blank02',
'Bytes', 'HTTPResult', 'ElapsedTime']
dtypes = {'Timestamp': 'str', 'Command': 'str', 'IPAddr': 'str', 'Blank01' : 'str',
'Blank02' : 'str', 'Bytes': 'str', 'HTTPResult': 'str', 'ElapsedTime': 'str'}
df = pd.read_csv(fpath, delimiter=' ', header=None, names=headers,
dtype=dtypes, warn_bad_lines=True, error_bad_lines=False)
Что происходит, так это то, что квадратные скобки вокруг временной метки обрабатываются пандами специально.
df['Timestamp'].head()
показывает:
[06/Nov/2020:00:43:04 +0200] /wsi/services/ServicesReadRequest
если я попытаюсь обрезать строку, похоже, что часть с квадратной скобкой игнорируется
df["Timestamp"].apply(lambda x: x[1:6]).head()
полученные результаты:
[06/Nov/2020:00:43:04 +0200] /wsi/s
если я удалю квадратные скобки вручную, то он будет работать так, как ожидалось (хотя часовой пояс отделяется от метки времени, но это потому, что между ними есть пробел). Теперь вопрос, как разобрать файл без какой-либо предварительной обработки? Есть ли альтернатива read_csv без таких побочных эффектов?
Timestamp
непреднамеренно стал индексом вашего DataFrame. Попробуйте добавить аргументindex_col=False
к вашему вызовуpd.read_csv
. - person jfaccioni   schedule 01.03.2021