как я могу извлечь разделенные ‘ r’ словари csv-файла с помощью python

#python #json

#python #json

Вопрос:

Я хочу получить значения ключей типа «Общее количество кбайт физической памяти: 8017608 и все остальные словари.

Для других словарей я использую код python, такой как:

 import csv
import json
x = []
    # r"""{"data":"foo \r\n bar"}"""
for line in open("forcasting/eventdat_Feb/event_nw_2019-02-01.json", 'r', encoding='utf8'):
    x.append(json.loads(line))
#for line in open("forcasting/eventdat_Feb/event_nw_2019-02-01.json", 'r', encoding='utf8',errors='ignore'):

#print(x[0]['_source']['text1']['log'])
f = csv.writer(open("forcasting/eventdat_Feb/Dart95/1st_feb.csv", "w"))
f.writerow(["timestamp","machine","id","customer","type","entered","enteredDate","servertime","username","host","text1_log","text2_log","string1_log"])

    for key in x:
            if key["_source"].get("scrip")=="31":
                    f.writerow([
                            key["_source"].get("@timestamp"),
                            key["_source"].get("machine"),
                            key["_source"].get("id"),
                            key["_source"].get("customer"),
                            key["_source"].get("type"),
                            key["_source"].get("entered"),
                            key["_source"].get("enteredDate"),
                            key["_source"].get("servertime"),
                            key["_source"].get("username"),
                            key["_source"].get("host"),
                            key["_source"].get("text1").get("log"),
                            key["_source"].get("text2").get("log"),
                            key["_source"].get("string1").get("log")
                    ])
  

Но в этом — key["_source"].get("text1").get("log") , я пытаюсь

 key["_source"].get("text1").get("log").get("Physical memory KBytes total") 
  

но это не работает.

Спасибо

проблема с извлечением данных из выделенной части этого изображения

это выделенная часть:

«text1»:{«log»:»Физическая память: всего кбайт физической памяти: 8017608 Кбайт используемой физической памяти: 5457192 Кбайт Используемой физической памяти: 68 Кбайт свободной физической памяти: 2560416 Кбайт свободной физической памяти: 32 Кбайт виртуальной памяти: всего кбайт виртуальной памяти: 137438953344 Кбайт используемой виртуальной памяти: 258064 кбайт Процент используемой виртуальной памяти: 0r Кбайт виртуальной памяти свободно: 137438695280r Процент виртуальной памяти свободно: 100 r Пространство подкачки: r Всего кбайт пространства подкачки: 12474056 r Используемое пространство подкачки, кбайт: 10285812r Используемое пространство подкачки, кбайт свободного пространства подкачки: 2188244r Свободное пространство подкачки, кбайт свободного пространства: 18r Период выборки мсек: 30000 r Количество считываний страниц в секунду: 2 r Количество запущенных процессов: 208″}

я не могу предоставить общий доступ ко всем json-файлам, они слишком большие, но я прилагаю пример файла, пожалуйста, проверьте, это наши системные данные (данные elasticsearch) в формате json, и мне нужно извлечь эти значения (значения в text1) для выполнения некоторого машинного обучения.

 {"_index":"event_nw_2019-02-01","_type":"events","_id":"uB-xp2gB5-JFORtVXbZW","_score":1,"_source":{"username":"ka100982","text4":{"log":"Process Image Name: Memory Compressionr Process PID: 2628r Process CPU: 0r Process Elapsed: 5:22:43r Process Mem Usage: 955508Kr  r Process Image Name: chrome#8r Process PID: 10312r Process CPU: 0r Process Elapsed: 5:21:46r Process Mem Usage: 287852Kr Process: C:\Program Files (x86)\Google\Chrome\Application\chrome.exer Process Version: 71.0.3578.98r Process Size: 1587680r Process Creation Date: Thursday, May 24, 2018 06:37:21r Process Last Modified Date: Tuesday, December 11, 2018 23:11:41r  r Process Image Name: chrome#3r Process PID: 5556r Process CPU: 0r Process Elapsed: 5:21:53r Process Mem Usage: 210620Kr Process: C:\Program Files (x86)\Google\Chrome\Application\chrome.exer Process Version: 71.0.3578.98r Process Size: 1587680r Process Creation Date: Thursday, May 24, 2018 06:37:21r Process Last Modified Date: Tuesday, December 11, 2018 23:11:41r  r Process Image Name: chrome#15r Process PID: 4516r Process CPU: 0r Process Elapsed: 5:20:41r Process Mem Usage: 202464Kr Process: C:\Program Files (x86)\Google\Chrome\Application\chrome.exer Process Version: 71.0.3578.98r Process Size: 1587680r Process Creation Date: Thursday, May 24, 2018 06:37:21r Process Last Modified Date: Tuesday, December 11, 2018 23:11:41r  r Process Image Name: chrome#12r Process PID: 3428r Process CPU: 0r Process Elapsed: 5:21:00r Process Mem Usage: 195764Kr Process: C:\Program Files (x86)\Google\Chrome\Application\chrome.exer Process Version: 71.0.3578.98r Process Size: 1587680r Process Creation Date: Thursday, May 24, 2018 06:37:21r Process Last Modified Date: Tuesday, December 11, 2018 23:11:41r  r Process Image Name: chrome#19r Process PID: 9628r Process CPU: 0r Process Elapsed: 4:25:37r Process Mem Usage: 191124Kr Process: C:\Program Files (x86)\Google\Chrome\Application\chrome.exer Process Version: 71.0.3578.98r Process Size: 1587680r Process Creation Date: Thursday, May 24, 2018 06:37:21r Process Last Modified Date: Tuesday, December 11, 2018 23:11:41r  r Process Image Name: iexplore#2r Process PID: 9296r Process CPU: 2r Process Elapsed: 5:18:38r Process Mem Usage: 173444Kr Process: C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXEr Process Version: 11.00.16299.15 (WinBuild.160101.0800)r Process Size: 822544r Process Creation Date: Thursday, August 23, 2018 07:50:50r Process Last Modified Date: Thursday, March 29, 2018 23:07:49r  r Process Image Name: chromer Process PID: 10152r Process CPU: 29r Process Elapsed: 5:21:54r Process Mem Usage: 170452Kr Process: C:\Program Files (x86)\Google\Chrome\Application\chrome.exer Process Version: 71.0.3578.98r Process Size: 1587680r Process Creation Date: Thursday, May 24, 2018 06:37:21r Process Last Modified Date: Tuesday, December 11, 2018 23:11:41r  r Process Image Name: chrome#9r Process PID: 10228r Process CPU: 0r Process Elapsed: 5:21:24r Process Mem Usage: 169132Kr Process: C:\Program Files (x86)\Google\Chrome\Application\chrome.exer Process Version: 71.0.3578.98r Process Size: 1587680r Process Creation Date: Thursday, May 24, 2018 06:37:21r Process Last Modified Date: Tuesday, December 11, 2018 23:11:41r  r Process Image Name: dcuappr Process PID: 9864r Process CPU: 16r Process Elapsed: 5:21:58r Process Mem Usage: 157184Kr Process: C:\Program Files\Verint\DPA\Client\DCUApp.exer Process Version: 11,1,1,19229r Process Size: 694272r Process Creation Date: Thursday, July 6, 2017 14:08:28r Process Last Modified Date: Thursday, July 6, 2017 14:08:28r  "},"idx":12483141,"version":"","string1":{"log":"27"},"uuid":"67cf6aa9-63f8-48a5-888d-127995fc09e1","id":"0","serverDate":"2019-02-01T06:14:05Z","Tags":["AllMemoryUtilizationEvents","MemUtilizationPhysicalMemoryLessThan8GB"],"entered":"1549001637","scrip":"6","windowtitle":"","text2":{"log":"Type of run: RealTime Monitoring"},"customer":"CompuCom_Selfheal__201800016","string2":{"log":"41444"},"priority":"5","description":"Memory Statistics","enteredDate":"2019-02-01T06:13:57Z","machine":"MH-NW0-198592","text1":{"log":"Physical memory:r Physical memory KBytes total: 8017608r Physical memory KBytes in use: 5457192r Physical memory Percentage in use: 68r Physical memory KBytes free: 2560416r Physical memory Percentage free: 32r Virtual memory:r Virtual memory KBytes total: 137438953344r Virtual memory KBytes in use: 258064r Virtual memory Percentage in use: 0r Virtual memory KBytes free: 137438695280r Virtual memory Percentage free: 100r Swap space:r Swap space KBytes total: 12474056r Swap space KBytes in use: 10285812r Swap space Percentage in use: 82r Swap space KBytes free: 2188244r Swap space Percentage free: 18r mSec Sampling period: 30000r Page reads per second: 2r Number of processes running: 208"},"@timestamp":"2019-02-01T06:14:05.294Z","type":"","clientsize":"9030168","size":"0","text3":{"log":""},"path":"","executable":"","servertime":1549001645,"clientversion":"3.002.036.3038.24","host":"35.225.19.235"}}
{"_index":"event_nw_2019-02-01","_type":"events","_id":"uR-xp2gB5-JFORtVXrYC","_score":1,"_source":{"username":"gh102434","text4":{"log":""},"idx":12483142,"version":"","string1":{"log":""},"uuid":"67f31b98-21af-49a6-a6b3-0a48406329cf","id":"0","serverDate":"2019-02-01T06:14:05Z","Tags":["Clientheartbeatevent"],"entered":"1549001644","scrip":"231","windowtitle":"","text2":{"log":"Type of run: Scheduled"},"customer":"CompuCom_Selfheal__201800016","string2":{"log":""},"priority":"5","description":"Client heartbeat","enteredDate":"2019-02-01T06:14:04Z","machine":"MX-D-CIT00100","text1":{"log":"SelfHeal Client is running and responding"},"@timestamp":"2019-02-01T06:14:05.464Z","type":"","clientsize":"9030168","size":"0","text3":{"log":""},"path":"","executable":"","servertime":1549001645,"clientversion":"3.002.036.3038.24","host":"35.225.19.235"}}
  

Комментарии:

1. Поделитесь своим входным файлом

2. Каково текущее поведение и ожидаемый результат? «Это не работает» не считается полезным.

3. пожалуйста, добавьте исходные данные, о которых идет речь.

4. Вы могли бы опубликовать эту выделенную часть в виде текста

5. @user202729 принимает все данные в text1 в виде строки и показывает обратную трассировку (последний вызов last): File «forcastingfeb_data_extract.py «, строка 27, в ключе <module>[«_source»].get(«text1»).get(«log»)[«Количество запущенных процессов»], ошибка типа: строковые индексы должны быть целыми числами

Ответ №1:

То, что у вас есть под ключом «log», является обычным текстом, а не объектом json, поэтому после десериализации вы получаете строку, а не dict. Вам придется самостоятельно проанализировать эту строку, чтобы извлечь данные.

Хорошей новостью является то, что синтаксический анализ не слишком сложен:

 def parsedata(logtext):
   # 'logtext' is the whole string value for the 'log' key
   return dict(
      s.strip().split(":") 
      for s in logtext.splitlines() 
      if ":" in s and not s.endswith(":")
      )

logtext = "Physical memory:r Physical memory KBytes total: 8017608r Physical memory KBytes in use: 5457192r Physical memory Percentage in use: 68r Physical memory KBytes free: 2560416r Physical memory Percentage free: 32r Virtual memory:r Virtual memory KBytes total: 137438953344r Virtual memory KBytes in use: 258064r Virtual memory Percentage in use: 0r Virtual memory KBytes free: 137438695280r Virtual memory Percentage free: 100r Swap space:r Swap space KBytes total: 12474056r Swap space KBytes in use: 10285812r Swap space Percentage in use: 82r Swap space KBytes free: 2188244r Swap space Percentage free: 18r mSec Sampling period: 30000r Page reads per second: 2r Number of processes running: 208"

print(parsedata[logtext])
  

=>

 {'Number of processes running': ' 208', 'Physical memory KBytes total': ' 8017608', 'Swap space KBytes in use': ' 10285812', 'Swap space Percentage free': ' 18', 'Page reads per second': ' 2', 'Physical memory Percentage free': ' 32', 'Virtual memory KBytes free': ' 137438695280', 'Physical memory Percentage in use': ' 68', 'Physical memory KBytes free': ' 2560416', 'Virtual memory Percentage in use': ' 0', 'Swap space KBytes free': ' 2188244', 'mSec Sampling period': ' 30000', 'Physical memory KBytes in use': ' 5457192', 'Virtual memory KBytes in use': ' 258064', 'Virtual memory KBytes total': ' 137438953344', 'Swap space KBytes total': ' 12474056', 'Virtual memory Percentage free': ' 100', 'Swap space Percentage in use': ' 82'}
  

Редактировать:

когда я использую его в своем коде для изменения этого вложенного словаря, он выдает мне эту ошибку: Traceback (последний вызов last): File «forcastingfeb_data_extract.py «, строка 17, в a = parsedata(x[i][«_source»].get(«text1»).get(«log»)) Файл «forcastingfeb_data_extract.py «, строка 11, в parsedata для s в logtext.splitlines() Ошибка значения: элемент последовательности обновления словаря # 0 имеет длину 3; требуется 2

Это означает, что одна из строк в тексте журнала содержит более одного ":" разделителя (в данном случае два, поскольку это приводит к триплету вместо пары).

Вы можете изменить parsedata реализацию, чтобы получить более точный отчет и в конечном итоге предпринять соответствующие действия (какие действия уместны в зависимости от того, что находится в строке и что вы хотите из этого извлечь):

 # caveat: untested code
def parsedata(logtext):
   # 'logtext' is the whole string value for the 'log' key
   parsed = {}
   for line in logtext.splitlines:
       line = line.strip().split()
       if not line:
           # empty line
           continue 
       if ":" not in line or line.endswith(":"):
          # we ignored those lines given your initial specs
          # but you may actually want to do something with...
          # let's at least print it for inspection
          print("line is not a key:value pair: '{}' -  ignoring".format(line))
          continue
       try:
           k, v = line.split(":")
       except ValueError:
          print("line has more than one separator: '{}' -  ignoring".format(line))
          # what to do here depends on what the line looks like
          # and what you want to do with it. 
          continue
      parsed[k] = v

  return parsed  
  

Если случится так, что дополнительный ':' разделитель действительно должен быть частью эффективного значения, вы можете либо перестроить значение из триплета (или любого другого размера кортежа):

 splitted = s.split(":") 
# some eventual tests here if needed
k, v = splitted[0], ":".join(*splitted[1:])
  

или просто используйте maxsplit аргумент

 k, v = s.split(":", 1) 
  

И здесь «правильное» действие зависит от фактических данных и контекста, поэтому только вы знаете, как это следует обрабатывать.

Просто обратите внимание, что все это очень простой материал для синтаксического анализа текста / обработки ошибок, который вам действительно следует научиться писать и отлаживать самостоятельно (простой синтаксический анализ текста на самом деле является очень распространенной задачей в прикладном программировании).

Комментарии:

1. но когда я использую его со своим кодом для изменения этого вложенного словаря, он выдает мне эту ошибку: Traceback (последний вызов last): File «forcastingfeb_data_extract.py «, строка 17, в <module> a = parsedata(x[i][«_source»].get(«text1»).get(«log»)) Файл «forcastingfeb_data_extract.py «, строка 11, в parsedata для s в logtext.splitlines() Ошибка значения: элемент последовательности обновления словаря # 0 имеет длину 3; требуется 2. Кто-нибудь может сказать мне, в чем проблема, я использую код синтаксического анализа в том же коде, который я написал в своем вопросе.

2. @shraddha см. мой отредактированный ответ — но это те вещи, которые вы действительно должны научиться отлаживать самостоятельно, потому что у вас будет много таких проблем при разборе слабо структурированного текста.