#python #list #file
#python #Список #файл
Вопрос:
У меня есть данные, которые представлены в формате ниже в файле.
"Attach Listener" #7338 daemon prio=9 os_prio=0 tid=0x00007f51c0009000 nid=0x731c waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"lettuce-nioEventLoop-9-155" #362 daemon prio=5 os_prio=0 tid=0x00007f515000c800 nid=0x4f7c runnable [0x00007f50da85d000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x0000000082af6f50> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <0x0000000082af8050> (a java.util.Collections$UnmodifiableSet)
- locked <0x0000000082af7f78> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:62)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:753)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:409)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- None
"lettuce-nioEventLoop-9-154" #360 daemon prio=5 os_prio=0 tid=0x00007f51d00c3800 nid=0x4dd5 runnable [0x00007f50da45b000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x0000000082afa8b0> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <0x0000000082afb9b0> (a java.util.Collections$UnmodifiableSet)
- locked <0x0000000082afb8d8> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:62)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:753)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:409)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- None
"Attach Listener" #7338 daemon prio=9 os_prio=0 tid=0x00007f51c0009000 nid=0x731c waiting on condition [0x0000000000000000]
java.lang.Thread.State: WAITING
Locked ownable synchronizers:
- None
Мне нужно сохранить полную трассировку стека на основе первой строки каждого стека. т.«lettuce-nioEventLoop-9-155» #362 daemon prio= 5 os_prio= 0 tid = 0x00007f515000c800 nid = 0x4f7c runnable [0x00007f50da85d000]
Мне нужно собрать первые строки каждой трассировки, и когда я сравниваю имеющиеся у меня данные с данными в файле, и если они совпадают, мне нужно собрать полную трассировку этого. Могут быть случаи, когда первая строка может быть одинаковой для какой-либо другой трассировки стека в том же файле, и если это так, мне нужно добавить ее к тем же уже собранным ранее данным.
Это то, что я сделал —
data_methods = []
tdfilename = r"C:UsershelloDesktoptrace_test.txt"
with open(tdfilename) as f:
for line in f:
method = re.findall(r'"(.*?)]', line)
fmethod = ''.join(method)
if fmethod:
data_methods.append(""" fmethod "]") # Adding " and ] at the start and end of the line as per the file content
f.close()
Я собираю первые строки всех трассировок стека в список. Моя идея здесь состоит в том, чтобы сравнить данные этого списка с данными в файле, и если они совпадают, мне нужно собрать полную трассировку. Я застрял на получении логики для этого.
Должен ли я использовать dict
для сохранения первой строки в виде ключей, а содержимого в виде значений, поскольку первые строки могут встречаться несколько раз с одними и теми же данными?
Как я могу этого добиться. Я делаю это, чтобы облегчить часть нашей работы в повседневной деятельности.
Комментарии:
1. «… поскольку ключи могут быть повторяющимися?» . Нет, они не могут.
2. извините, я виноват. обновлен вопрос. Я имел в виду, поскольку первые строки трассировок стека могут встречаться несколько раз и могут быть соединены, мне нужно добавить данные к одному и тому же.
3. Эти данные выглядят как журнал. Если вам нужно обработать большое количество журналов, было бы неплохо использовать ELK stack, вы также можете использовать интерфейс python. elastic.co/elk-stack
4. спасибо за идею. это файл дампа с небольшим количеством данных, который генерируется не часто. Я планирую достичь этого, используя сам Python, поскольку остальные мои другие коды находятся на Python
Ответ №1:
defaultdict
Может быть удобно, когда вы хотите создать новую вещь в сопоставлении и добавить к нему, если оно уже существует. Здесь я бы просто сделал:
data_methods = collections.defaultdict(list)
tdfilename = r"C:UsershelloDesktoptrace_test.txt"
firstpattern = re.compile(r'".*]s*$')
with open(tdfilename) as f:
for line in f:
if firstpattern.match(line)
cur = data_methods[line.strip()]
else:
cur.append(line)
Затем вам нужно просто объединить значения, например, для вывода результата:
for k, v in data_methods.items():
print(k)
print(''.join(v))
Комментарии:
1. Серж, вы упомянули
cur
как строку, а также список. это правильно? также дляdata_methods.items:
строки кода, я вижуTypeError: 'builtin_function_or_method' object is not iterable
, мы должны добавить что-нибудь здесь?2. Это должно было быть
data_methods.items()
(исправлено). Для первого пунктаcur
это список строк, причина, по которой я используюjoin
для его объединения. Python обычно лучше добавляет строки в список, чем многократное объединение в строку.3. Спасибо, Серж! я смог изменить это в соответствии с моими потребностями.
Ответ №2:
Кажется, вы можете положиться на отступ в формате трассировки. Итак, это базовая версия:
td_filename = 'trace.txt'
exc_dict = {}
with open(td_filename) as f:
cur_line = None
for line in f:
if line.startswith(' ') or line.startswith('n'):
if cur_line is not None:
exc_dict[cur_line].append(line)
else:
if line not in exc_dict:
exc_dict[line] = []
cur_line = line
for k in exc_dict:
print(k)
print(exc_dict[k])
print('n')
Если вы хотите разделить отдельные исключения и объединить строки, попробуйте это:
td_filename = 'trace.txt'
exc_dict = {}
with open(td_filename) as f:
cur_line = None
for line in f:
if line.startswith(' ') or line.startswith('n'):
if cur_line is not None:
if exc_dict[cur_line][-1] is None:
exc_dict[cur_line][-1] = ''
exc_dict[cur_line][-1] = line
else:
if line not in exc_dict:
exc_dict[line] = []
exc_dict[line].append(None)
cur_line = line
for k in exc_dict:
print(k)
for e in exc_dict[k]:
print(e)
print('n')
Комментарии:
1. Привет, спасибо, но это разбивает каждую строку на один элемент, создавая больше строк данных
2. Я добавил и альтернативу, в которой соединяются строки.
3. Здравствуйте, конечно, спасибо .. я попробую и дам вам знать .. ценю вашу помощь.