Разбор файла .txt в csv/xlsx в python

Я новичок в python, пробуя сценарий синтаксического анализа файла .txt в формате csv/xlsx. Я столкнулся с проблемой ниже.

код для разбора (html в txt):

import requests as req
import re

resp = req.get("my_server_url")

content = resp.text

stripped = re.sub('<[^<]+?>', '', content)
with open("Output.txt", "w") as text_file:
   print("Purchase Amount: {}".format(stripped), file=text_file)
print(stripped)

После синтаксического анализа в текстовый файл я получаю следующий вывод в формате .txt:

Servicegroup 'app_service' Host State Breakdowns:


Host% Time Up% Time Down% Time Unreachable% Time Undetermined
sever1.domain.com:1717100.000% (100.000%)0.000% (0.000%)0.000%   (0.000%)0.000%
sever2.domain.com:1717100.000% (100.000%)0.000% (0.000%)0.000%  (0.000%)0.000%
sever3.domain.com:1717100.000% (100.000%)0.000% (0.000%)0.000% (0.000%)0.000%
Average100.000% (100.000%)0.000% (0.000%)0.000% (0.000%)0.000%


Servicegroup 'app_service' Service State Breakdowns:


HostService% Time OK% Time Warning% Time Unknown% Time Critical% Time  Undetermined
sever1.domain.com:1717app_availability_check0.000% (0.000%)0.000%    (0.000%)0.000% (0.000%)100.000% (100.000%)0.000%
app_data_size_check0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)100.000%  (100.000%)0.000%
app_hitrate_check0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)100.000% (100.000%)0.000%
app_log_size_check0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)100.000% (100.000%)0.000%
app_sessions_check0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)100.000% (100.000%)0.000%
sever2.domain.com:1717app_availability_check100.000% (100.000%)0.000%    (0.000%)0.000% (0.000%)0.000% (0.000%)0.000%
app_data_size_check100.000% (100.000%)0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)0.000%
app_hitrate_check100.000% (100.000%)0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)0.000%
app_log_size_check100.000% (100.000%)0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)0.000%
app_sessions_check100.000% (100.000%)0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)0.000%
sever3.domain.com:1717app_availability_check100.000% (100.000%)0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)0.000%
app_data_size_check100.000% (100.000%)0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)0.000%
app_hitrate_check100.000% (100.000%)0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)0.000%
app_log_size_check100.000% (100.000%)0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)0.000%
app_sessions_check100.000% (100.000%)0.000% (0.000%)0.000% (0.000%)0.000% (0.000%)0.000%
Average87.500% (87.500%)0.000% (0.000%)0.000% (0.000%)12.500% (12.500%)0.000%

из этого вывода выше мне нужно проанализировать то же самое в excel со следующими значениями в соответствующих столбцах

column 1               column 2       column 3                                      column 4
Host%                  Time Up%       HostService%                                  Time OK% 
sever1.domain.com:1717 100.000%       sever1.domain.com:1717app_availability_check  0.000%
sever2.domain.com:1717 100.000%       sever2.domain.com:1717app_availability_check  100.000%
sever3.domain.com:1717 100.000%       sever3.domain.com:1717app_availability_check  100.000%

Есть ли способ получить эти конкретные данные в csv/excel? Любая помощь приветствуется


person Alex    schedule 06.10.2017    source источник


Ответы (1)


Вам нужно лучше очищать данные или быть более инклюзивным с вашим регулярным выражением.

Как правило, вы не хотите заменять «что-то» на «ничего», когда вам еще нужно выполнить обработку. Когда вы удалили теги HTML, у вас остались данные, которые соприкасаются друг с другом. Вместо этого вы хотите использовать разделитель, чтобы вы могли разбить его дальше в сценарии.

Рассмотреть возможность,

import string

DELIM = '||'

stripped = re.sub('<[^<]+?>', DELIM, content)
lines = []

for line in stripped.split():
    line = line.strip('|')

    # make sure it's an actual data line
    if line[0] in string.ascii_uppercase and line[-1] == '%':
        continue

    columns = [c.strip('%() ') for c in line.split(DELIM)]

    lines.append(columns)

..
..
# write lines to csv via `csv` module

Теперь мы можем определить, является ли каждая строка фактическими данными, поскольку имена хостов начинаются с нижнего регистра, а последний столбец представляет собой процент. Затем мы можем снова разделить каждую строку, удалив ненужные символы из каждого столбца.

В конце у нас остается список кортежей, где каждый элемент в списке — это строка, а каждый элемент в строке — это ячейка.

Важно помнить, что str.strip удалит любой из этих символов в любом порядке, если они являются одним из самых внешних значений.

x = 'abcdefg00001111!!'
print(x.strip('cab0!1'))
..
.. output:
defg
person blakev    schedule 06.10.2017
comment
Итак, я должен повторно проанализировать данные, используя вышеупомянутую концепцию, которую вы упомянули? при разборе его в txt файл из html? - person Alex; 07.10.2017
comment
Я пробовал приведенный выше код. Он не дает ожидаемого результата, так как мне нужны только 4 столбца данных, которые я упомянул выше. - person Alex; 07.10.2017