Python JSON

This topic is to discuss the following lesson:

Hi rene.

In a json like this…

{
    "routers": 
      {
        "name": "CSR1000V",
        "vendor": "Cisco",
        "type": "virtual"
      },
      {
        "name": "1921",
        "vendor": "Cisco",
        "type": "hardware"
      }
   
}

How can I select the “routers” label?

In this json I have not the “[]” after “routers” labels.

For example I have to select…if is there routers do something…if there a firewalls do something other…

Thanks you

Hi Giovanni,

You probably already have an answer but just in case…

When you want to “select” a certain field in a JSON (or dictionary), it’s best to use an IDE like vscode and use the debugger to select what you need. For example:

Rene

Hi Rene and staff,
you don’t talk about CSV with python, so may i ask a question about python with CSV format in this section ?
Example 1: let’s python read a csv file
image

Exemple1 is a string, then apply csv.reader(): you get an object “_csv.reader” but this is not a loop object

Example 2: just open the csv file
image
f is a _io.TextIOWrapper object, then apply csv.reader(): you get an object “_csv.reader” as well, but THIS IS a loop object

I don’t understand why in example 1, a “_csv.reader” object is NOT a loop object, and in example 2, the same object (same class) is a loop object.
So the same object seems to be not consistent as it comes from a string or a _io.TextIOWrapper object.
Could you help me ?
Best regards

Bonjour @syncope988,

Using open or with open is the same thing, except when you use “with”, it automatically closes.

First Example

  • You use the read() function on “f” and assign the output to the “exemple1” variable. When you use the read() function, you get a string.
  • You then run the reader() function from the CSV module, feed it the “exemple1” variable and assign the output to the “exemple_f” variable.
  • You then iterate over each item in the “exemple_f” variable.

When you check what “row” is, you’ll see it’s a list with only a single character. That’s why you get an index out of range error. There is only one item in the list, that’s why [0] works but not [1] or [2].

Second Example

  • You open the csv_example.csv file and assign the output to variable “f”.
  • You run the reader() function from the CSV module and assign the output to variable “exemple_f”.
  • You iterate over variable “exemple_f”.

This time, you didn’t use the read() function.

By doing it like this, each line in your CSV file becomes a list. That’s why you can use [0], [1], [2], etc. to access the items in your list.

In a nutshell: data and data conversion can be a pain. You can’t always predict what kind of object you get in return…a string, tuple, list, or dictionary. For example, the read() function returns a string but the readlines() function returns a list.

To make your life a lot easier, try to run some Python scripts in visual studio code. When you add a breakpoint, you can visualize what your data looks like:

You can even right-click on what you want to use and choose “copy as expression”:

And use it in your code, or in the debug console:

This makes it much easier compared to using the python interpreter or IDLE where you have to use the print or type function to see things. Give it a try, it will be very helpful :slight_smile:

Doe this explanation help?

Rene

Hi Rene,
yes it helps a lot
Great thanks
Regards

Hello everyone,

Would you recommend a particular tool to parse info from “show” commands using Python?

Thanks!

Hello Heberto

Take a look at this lesson which deals with some parsing using JSON:

Now having said that, if you want to use a purpose-designed tool for this, you can use any of the following specialized libraries and tools:

  1. TextFSM: TextFSM is a Python module developed by Google which is widely used for parsing semi-structured text data like the output from “show” commands in Cisco IOS. It allows you to define a template that maps the output into a structured format, making it easier to process and analyze. TextFSM is particularly powerful for parsing complex and varied text outputs.

  2. Netmiko: While primarily a library for handling SSH connections to network devices, Netmiko can be used in conjunction with TextFSM to send commands and parse the output. Netmiko simplifies the process of connecting to a device, executing commands, and retrieving the output.

  3. PyATS/Genie: Developed by Cisco, PyATS is a Python automation framework designed specifically for network testing. Genie is part of the PyATS ecosystem and provides libraries for modeling and parsing network devices’ configurations and operational state. Genie can parse the output of “show” commands into structured JSON data, making it easier to work with programmatically.

  4. Nornir: Nornir is a pluggable multi-threaded framework with inventory management to help operate collections of devices. It can use Netmiko and other plugins to connect to devices, send commands, and parse the output.

  5. Ansible with ios_command module: Although Ansible is not a Python library per se, it is a powerful automation tool that can be used for network automation tasks. The ios_command module in Ansible allows you to run commands on remote Cisco IOS devices and can be used in conjunction with parsing filters to structure the output.

Each of these tools has its strengths, and the best choice may depend on the specific requirements of your project, such as the complexity of the data you’re dealing with, the scale of your network, and your familiarity with these tools. TextFSM is a great starting point for simple parsing tasks, while PyATS/Genie offers a more comprehensive solution for Cisco-specific environments. Netmiko and Nornir are excellent for broader automation tasks that include but are not limited to parsing command outputs.

I hope this has been helpful!

Laz