Как выбросить строки текста с указанными c символами? - PullRequest
1 голос
/ 11 апреля 2020

У меня есть несколько .log файлов, которые выглядят следующим образом:

#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2020-04-02 00:09:16
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2020-04-02 00:14:16 172.31.11.70 GET /ben_laptop_Apple.html - 443 - 156.154.81.54 curl/7.54.0 - 404 0 2 28
...
2020-04-02 00:19:16 172.31.11.70 GET /ben_laptop_Apple.html - 443 - 123.123.23.23 curl/7.54.0 - 404 0 2 47

Я хочу проанализировать и объединить поля, чтобы получить красиво отформатированную таблицу Pandas. Для этого у меня хорошо работает следующее:

# Match the extension pattern and save the list of file names in the ‘all_filenames’ variable.
extension = 'log'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]

# Use pandas to concatenate all files in the list and export as CSV. The output file is named “combined_csv.csv” located in your working directory.
fields = 'date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken'.split(' ')

#combine all files in the list
combined_csv = pd.concat([pd.read_csv(f, sep=' ', header=None, skiprows=4, names=fields) for f in all_filenames ])

Как видите, я пропускаю первые 4 строки, чтобы удалить текст заголовка. Однако проблема в том, что один файл журнала будет иметь текст заголовка, повторенный по всему файлу .log. Таким образом, мои файлы на самом деле выглядят так:

    #Software: Microsoft Internet Information Services 10.0
    #Version: 1.0
    #Date: 2020-04-02 00:09:16
    #Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
    2020-04-02 00:14:16 172.31.11.70 GET /ben_laptop_Apple.html - 443 - 156.154.81.54 curl/7.54.0 - 404 0 2 28
    ...
    #Software: Microsoft Internet Information Services 10.0
    #Version: 1.0
    #Date: 2020-04-02 00:09:16
    #Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
    ...
    2020-04-02 00:19:16 172.31.11.70 GET /ben_laptop_Apple.html - 443 - 123.123.23.23 curl/7.54.0 - 404 0 2 47

Как отфильтровать повторяющийся текст заголовка? Я предполагаю, что мне нужно решение RegEx.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Вместо использования skiprows=4 вы должны использовать comment='#'. Таким образом, ваш pd.read_csv пропустит строки, начинающиеся с #:

combined_csv = pd.concat([pd.read_csv(f, sep=' ', header=None, comment='#', names=fields) for f in all_filenames ])
0 голосов
/ 11 апреля 2020

Я думаю, что это может помочь вам:

df = pd.read_csv('sample_file.csv', comment='#')

Из документации:

comment : str, default None

Указывает остаток от Строка не должна быть проанализирована. Если найдено в начале строки, строка будет полностью проигнорирована. Этот параметр должен быть одним символом. Как и пустые строки (до тех пор, пока skip_blank_lines = True), полностью закомментированные строки игнорируются заголовком параметра, но не пропускаются. Например, если комментарий = '#', анализ '# emptyna, b, cn1,2,3' с заголовком = 0 приведет к тому, что 'a, b, c' будет считаться заголовком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...