Skip to main content

Converts an indented text or list of strings into a nested dictionary structure based on the indentation levels.

pip install indent2dict

Args:
	data (str, bytes, or list): The input data to be converted into a nested dictionary. It can be a string, bytes,
		or a list of strings.
	removespaces (bool): If True, leading and trailing whitespaces in the strings will be removed when constructing
		the dictionary keys. If False, whitespaces will be preserved.

Returns:
	dict: A nested dictionary structure where each level is determined by the indentation in the input data.
		The structure represents a hierarchy of items based on the indentation levels.

Example:
	input_data = [
		"Category 1",
		"  Subcategory 1.1",
		"    Item 1.1.1",
		"  Subcategory 1.2",
		"Category 2",
		"  Item 2.1",
	]

	result = indent2dict(input_data, removespaces=True)

	The 'result' will be:
	{
		'Category 1': {
			'Subcategory 1.1': {'Item 1.1.1': 0},
			'Subcategory 1.2': 1
		},
		'Category 2': {'Item 2.1':2}
	}


da2 = """      
      DecorView@479a814[HomeActivity]
        android.widget.LinearLayout{c7ad8bd V.E...... ......ID 0,0-1600,900}
          android.view.ViewStub{d860eb2 G.E...... ......I. 0,0-0,0 #102018a android:id/action_mode_bar_stub}
          android.widget.FrameLayout{a3aae03 V.E...... ......ID 0,0-1600,900 #1020002 android:id/content}
            android.widget.FrameLayout{5533180 V.E...... ......ID 0,0-1600,900}
              androidx.drawerlayout.widget.DrawerLayout{68143b9 VFE...... ......ID 0,36-1600,900 #7f0800af app:id/drawer_layout}
                com.bluestacks.launcher.widget.ItemOptionView{1c263fe VFED..... .F....ID 0,0-1600,864 #7f0800dd app:id/item_option}
                  androidx.constraintlayout.widget.ConstraintLayout{eb0275f V.E...... ......ID 0,0-1600,864}
                    android.widget.RelativeLayout{f79e5ac VFE...C.. ......ID 501,81-1100,130 #7f080133 app:id/searchRelativeLayout}
                      android.widget.ImageView{9e96275 V.ED..... ......ID 19,14-38,33 #7f080132 app:id/searchPlayIcon}
                      android.widget.ImageView{fdcc20a VFED..C.. ......ID 561,14-580,33 #7f080131 app:id/searchIcon}
                      android.widget.EditText{1d9da7b VFED..CL. ......ID 37,0-561,49 #7f080130 app:id/searchEditText}
                    com.bluestacks.launcher.widget.Desktop{75b098 VFED..... ......ID 44,166-1556,554 #7f08009c app:id/desktop}
                      com.bluestacks.launcher.widget.CellContainer{b7ab0f1 V.ED..... ......ID 0,0-1512,388}
                        d1.b{8cf4d6 VFED..CL. ........ 0,0-252,194}
                        d1.b{221a357 VFED..CL. ........ 252,0-504,194}
                        d1.b{4613e44 VFED..CL. ........ 504,0-756,194}
                        d1.b{af86b2d VFED..CL. ........ 756,0-1008,194}
                        d1.b{e3b8862 VFED..CL. ........ 1008,0-1260,194}
                        d1.b{25367c7 VFED..CL. ......I. 0,0-0,0}
                    com.bluestacks.launcher.widget.PagerIndicator{b31df3 I.ED..... ......ID 0,554-1600,570 #7f08009d app:id/desktopIndicator}
                    android.widget.LinearLayout{c55fab0 I.E...... ......ID 737,570-864,600 #7f0800d9 app:id/install_progress_layout}
                      android.widget.ProgressBar{71d8d29 V.ED..... ......ID 10,7-25,22 #7f0800ec app:id/loadingBar}
                      android.widget.TextView{f4dc8ae V.ED..... ......ID 35,4-117,25 #7f0800da app:id/installingGame}
                    android.widget.LinearLayout{bd7a64f V.E...... .......D 196,631-1404,864 #7f0800a5 app:id/dock}
                      android.widget.TextView{f9811dc V.ED..... ........ 0,9-1208,27 #7f080118 app:id/popular_gam}
                      android.widget.FrameLayout{558d2e5 V.E...... .......D 0,27-1208,233 #7f0800bb app:id/frameLayout}
                        android.view.View{931c1ba V.ED..... ......ID 0,90-1208,206 #7f08017b app:id/viewBackground}
                        android.widget.FrameLayout{312586b V.E...... .......D 0,0-1208,206}
                          android.widget.ProgressBar{3826fc8 G.ED..... ......I. 589,88-619,118 #7f0800a6 app:id/dockLoadingBar}
                          android.widget.LinearLayout{948b861 V.E...... .......D 62,-8-1146,182 #7f080048 app:id/allappsLinearLayout}
                            android.widget.LinearLayout{82a3f86 VFE...C.. .......D 66,0-225,190 #7f080050 app:id/appOneLinearLayout}
                              android.widget.FrameLayout{fc1047 V.E...... ......ID 29,34-129,134 #7f080058 app:id/app_image_one}
                                android.widget.ImageView{632c074 V.ED..... ......ID 74,3-97,26 #7f08011b app:id/popup_image_one}
                              android.widget.TextView{7f7799d V.ED..... ........ 0,142-159,190 #7f080060 app:id/app_name_one}
                            android.widget.LinearLayout{7dace12 VFE...C.. .......D 225,0-384,190 #7f080053 app:id/appTwoLinearLayout}
                              android.widget.FrameLayout{6df69e3 V.E...... ......ID 29,34-129,134 #7f08005b app:id/app_image_two}
                                android.widget.ImageView{7f56fe0 I.ED..... ......ID 74,3-97,26 #7f08011e app:id/popup_image_two}
                              android.widget.TextView{2d71299 V.ED..... ........ 0,142-159,190 #7f080063 app:id/app_name_two}
                            android.widget.LinearLayout{893b95e VFE...C.. .......D 384,0-543,190 #7f080052 app:id/appThreeLinearLayout}
                              android.widget.FrameLayout{614c13f V.E...... ......ID 29,34-129,134 #7f08005a app:id/app_image_three}
                                android.widget.ImageView{f71aa0c I.ED..... ......ID 74,3-97,26 #7f08011d app:id/popup_image_three}
                              android.widget.TextView{67d3f55 V.ED..... ........ 0,142-159,190 #7f080062 app:id/app_name_three}
                            android.widget.LinearLayout{d5e0d6a VFE...C.. .......D 543,0-702,190 #7f08004f app:id/appFourLinearLayout}
                              android.widget.FrameLayout{31e325b V.E...... ......ID 29,34-129,134 #7f080057 app:id/app_image_four}
                                android.widget.ImageView{4955af8 V.ED..... ......ID 74,3-97,26 #7f08011a app:id/popup_image_four}
                              android.widget.TextView{91f7bd1 V.ED..... ........ 0,142-159,190 #7f08005f app:id/app_name_four}
                            android.widget.LinearLayout{ec79636 VFE...C.. .......D 702,0-860,190 #7f08004e app:id/appFiveLinearLayout}
                              android.widget.FrameLayout{e839937 V.E...... ......ID 29,34-129,134 #7f080056 app:id/app_image_five}
                                android.widget.ImageView{e412ea4 I.ED..... ......ID 74,3-97,26 #7f080119 app:id/popup_image_five}
                              android.widget.TextView{4cf040d V.ED..... ........ 0,142-158,190 #7f08005e app:id/app_name_five}
                            android.widget.LinearLayout{e6edfc2 VFE...C.. .......D 860,0-1018,190 #7f080051 app:id/appSixLinearLayout}
                              android.widget.FrameLayout{f6e91d3 V.E...... ......ID 29,34-129,134 #7f080059 app:id/app_image_six}
                                android.widget.ImageView{eb49110 V.ED..... ......ID 74,3-97,26 #7f08011c app:id/popup_image_six}
                              android.widget.TextView{974d409 V.ED..... ........ 0,142-158,190 #7f080061 app:id/app_name_six}
                    com.bluestacks.launcher.widget.GroupPopupView{74f360e IFE...C.. ......ID 0,0-1600,864 #7f0800c2 app:id/groupPopup}
                      androidx.cardview.widget.CardView{6a0c61c I.E...... ......ID 0,0-647,406}
                        android.widget.LinearLayout{c06782f V.E...... ......ID 6,6-641,400}
                          android.widget.TextView{ab9ae3c VFED..C.. ........ 25,20-635,54 #7f0800c4 app:id/group_popup_label}
                          com.bluestacks.launcher.widget.CellContainer{28da7c5 I.ED..... ......ID 37,54-598,374 #7f0800c1 app:id/group}
                    android.view.View{6cca51a V.ED..... ......ID 44,166-82,554 #7f0800e3 app:id/leftDragHandle}
                    android.view.View{b8c684b V.ED..... ......ID 1518,166-1556,554 #7f080128 app:id/rightDragHandle}
                  com.bluestacks.launcher.widget.ItemOptionView$c{7917228 V.ED..... ........ 0,0-1600,864}"""

from indent2dict import indent2dict
conv = indent2dict(da2, removespaces=True)
print(conv)

{
    "DecorView@479a814[HomeActivity]": {
        "android.widget.LinearLayout{c7ad8bd V.E...... ......ID 0,0-1600,900}": {
            "android.widget.FrameLayout{a3aae03 V.E...... ......ID 0,0-1600,900 #1020002 android:id/content}": {
                "android.widget.FrameLayout{5533180 V.E...... ......ID 0,0-1600,900}": {
                    "androidx.drawerlayout.widget.DrawerLayout{68143b9 VFE...... ......ID 0,36-1600,900 #7f0800af app:id/drawer_layout}": {
                        "com.bluestacks.launcher.widget.ItemOptionView{1c263fe VFED..... .F....ID 0,0-1600,864 #7f0800dd app:id/item_option}": {
                            "androidx.constraintlayout.widget.ConstraintLayout{eb0275f V.E...... ......ID 0,0-1600,864}": {
                                "android.widget.LinearLayout{bd7a64f V.E...... .......D 196,631-1404,864 #7f0800a5 app:id/dock}": {
                                    "android.widget.FrameLayout{558d2e5 V.E...... .......D 0,27-1208,233 #7f0800bb app:id/frameLayout}": {
                                        "android.widget.FrameLayout{312586b V.E...... .......D 0,0-1208,206}": {
                                            "android.widget.LinearLayout{948b861 V.E...... .......D 62,-8-1146,182 #7f080048 app:id/allappsLinearLayout}": {
                                                "android.widget.LinearLayout{82a3f86 VFE...C.. .......D 66,0-225,190 #7f080050 app:id/appOneLinearLayout}": {
                                                    "android.widget.FrameLayout{fc1047 V.E...... ......ID 29,34-129,134 #7f080058 app:id/app_image_one}": {
                                                        "android.widget.ImageView{632c074 V.ED..... ......ID 74,3-97,26 #7f08011b app:id/popup_image_one}": 15
                                                    },
                                                    "android.widget.TextView{7f7799d V.ED..... ........ 0,142-159,190 #7f080060 app:id/app_name_one}": 16,
                                                },
                                                "android.widget.LinearLayout{7dace12 VFE...C.. .......D 225,0-384,190 #7f080053 app:id/appTwoLinearLayout}": {
                                                    "android.widget.FrameLayout{6df69e3 V.E...... ......ID 29,34-129,134 #7f08005b app:id/app_image_two}": {
                                                        "android.widget.ImageView{7f56fe0 I.ED..... ......ID 74,3-97,26 #7f08011e app:id/popup_image_two}": 19
                                                    },
                                                    "android.widget.TextView{2d71299 V.ED..... ........ 0,142-159,190 #7f080063 app:id/app_name_two}": 20,
                                                },
                                                "android.widget.LinearLayout{893b95e VFE...C.. .......D 384,0-543,190 #7f080052 app:id/appThreeLinearLayout}": {
                                                    "android.widget.FrameLayout{614c13f V.E...... ......ID 29,34-129,134 #7f08005a app:id/app_image_three}": {
                                                        "android.widget.ImageView{f71aa0c I.ED..... ......ID 74,3-97,26 #7f08011d app:id/popup_image_three}": 23
                                                    },
                                                    "android.widget.TextView{67d3f55 V.ED..... ........ 0,142-159,190 #7f080062 app:id/app_name_three}": 24,
                                                },
                                                "android.widget.LinearLayout{d5e0d6a VFE...C.. .......D 543,0-702,190 #7f08004f app:id/appFourLinearLayout}": {
                                                    "android.widget.FrameLayout{31e325b V.E...... ......ID 29,34-129,134 #7f080057 app:id/app_image_four}": {
                                                        "android.widget.ImageView{4955af8 V.ED..... ......ID 74,3-97,26 #7f08011a app:id/popup_image_four}": 27
                                                    },
                                                    "android.widget.TextView{91f7bd1 V.ED..... ........ 0,142-159,190 #7f08005f app:id/app_name_four}": 28,
                                                },
                                                "android.widget.LinearLayout{ec79636 VFE...C.. .......D 702,0-860,190 #7f08004e app:id/appFiveLinearLayout}": {
                                                    "android.widget.FrameLayout{e839937 V.E...... ......ID 29,34-129,134 #7f080056 app:id/app_image_five}": {
                                                        "android.widget.ImageView{e412ea4 I.ED..... ......ID 74,3-97,26 #7f080119 app:id/popup_image_five}": 31
                                                    },
                                                    "android.widget.TextView{4cf040d V.ED..... ........ 0,142-158,190 #7f08005e app:id/app_name_five}": 32,
                                                },
                                                "android.widget.LinearLayout{e6edfc2 VFE...C.. .......D 860,0-1018,190 #7f080051 app:id/appSixLinearLayout}": {
                                                    "android.widget.FrameLayout{f6e91d3 V.E...... ......ID 29,34-129,134 #7f080059 app:id/app_image_six}": {
                                                        "android.widget.ImageView{eb49110 V.ED..... ......ID 74,3-97,26 #7f08011c app:id/popup_image_six}": 35
                                                    },
                                                    "android.widget.TextView{974d409 V.ED..... ........ 0,142-158,190 #7f080061 app:id/app_name_six}": 36,
                                                },
                                            },
                                            "android.widget.ProgressBar{3826fc8 G.ED..... ......I. 589,88-619,118 #7f0800a6 app:id/dockLoadingBar}": 37,
                                        },
                                        "android.view.View{931c1ba V.ED..... ......ID 0,90-1208,206 #7f08017b app:id/viewBackground}": 38,
                                    },
                                    "android.widget.TextView{f9811dc V.ED..... ........ 0,9-1208,27 #7f080118 app:id/popular_gam}": 39,
                                },
                                "com.bluestacks.launcher.widget.GroupPopupView{74f360e IFE...C.. ......ID 0,0-1600,864 #7f0800c2 app:id/groupPopup}": {
                                    "androidx.cardview.widget.CardView{6a0c61c I.E...... ......ID 0,0-647,406}": {
                                        "android.widget.LinearLayout{c06782f V.E...... ......ID 6,6-641,400}": {
                                            "android.widget.TextView{ab9ae3c VFED..C.. ........ 25,20-635,54 #7f0800c4 app:id/group_popup_label}": 43,
                                            "com.bluestacks.launcher.widget.CellContainer{28da7c5 I.ED..... ......ID 37,54-598,374 #7f0800c1 app:id/group}": 44,
                                        }
                                    }
                                },
                                "com.bluestacks.launcher.widget.Desktop{75b098 VFED..... ......ID 44,166-1556,554 #7f08009c app:id/desktop}": {
                                    "com.bluestacks.launcher.widget.CellContainer{b7ab0f1 V.ED..... ......ID 0,0-1512,388}": {
                                        "d1.b{8cf4d6 VFED..CL. ........ 0,0-252,194}": 47,
                                        "d1.b{221a357 VFED..CL. ........ 252,0-504,194}": 48,
                                        "d1.b{4613e44 VFED..CL. ........ 504,0-756,194}": 49,
                                        "d1.b{af86b2d VFED..CL. ........ 756,0-1008,194}": 50,
                                        "d1.b{e3b8862 VFED..CL. ........ 1008,0-1260,194}": 51,
                                        "d1.b{25367c7 VFED..CL. ......I. 0,0-0,0}": 52,
                                    }
                                },
                                "android.widget.RelativeLayout{f79e5ac VFE...C.. ......ID 501,81-1100,130 #7f080133 app:id/searchRelativeLayout}": {
                                    "android.widget.ImageView{9e96275 V.ED..... ......ID 19,14-38,33 #7f080132 app:id/searchPlayIcon}": 54,
                                    "android.widget.ImageView{fdcc20a VFED..C.. ......ID 561,14-580,33 #7f080131 app:id/searchIcon}": 55,
                                    "android.widget.EditText{1d9da7b VFED..CL. ......ID 37,0-561,49 #7f080130 app:id/searchEditText}": 56,
                                },
                                "android.widget.LinearLayout{c55fab0 I.E...... ......ID 737,570-864,600 #7f0800d9 app:id/install_progress_layout}": {
                                    "android.widget.ProgressBar{71d8d29 V.ED..... ......ID 10,7-25,22 #7f0800ec app:id/loadingBar}": 58,
                                    "android.widget.TextView{f4dc8ae V.ED..... ......ID 35,4-117,25 #7f0800da app:id/installingGame}": 59,
                                },
                                "com.bluestacks.launcher.widget.PagerIndicator{b31df3 I.ED..... ......ID 0,554-1600,570 #7f08009d app:id/desktopIndicator}": 60,
                                "android.view.View{6cca51a V.ED..... ......ID 44,166-82,554 #7f0800e3 app:id/leftDragHandle}": 61,
                                "android.view.View{b8c684b V.ED..... ......ID 1518,166-1556,554 #7f080128 app:id/rightDragHandle}": 62,
                            },
                            "com.bluestacks.launcher.widget.ItemOptionView$c{7917228 V.ED..... ........ 0,0-1600,864}": 63,
                        }
                    }
                }
            },
            "android.view.ViewStub{d860eb2 G.E...... ......I. 0,0-0,0 #102018a android:id/action_mode_bar_stub}": 64,
        }
    }
}

data2 = """  
    MIME Typed Actions:
      com.android.camera.action.REVIEW:
        222a358 com.android.gallery3d/.app.GalleryActivity filter ca957c3
          Action: "android.intent.action.VIEW"
          Action: "com.android.camera.action.REVIEW"
          Category: "android.intent.category.DEFAULT"
          Category: "android.intent.category.BROWSABLE"
          Scheme: ""
          Scheme: "http"
          Scheme: "https"
          Scheme: "content"
          Scheme: "file"
          Type: "image"
          Type: "application/vnd.google.panorama360+jpg"
          mPriority=0, mOrder=0, mHasPartialTypes=true
        222a358 com.android.gallery3d/.app.GalleryActivity filter a9f840
          Action: "com.android.camera.action.REVIEW"
          Category: "android.intent.category.DEFAULT"
          Category: "android.intent.category.BROWSABLE"
          Scheme: "http"
          Scheme: "https"
          Scheme: "content"
          Scheme: "file"
          Type: "video/mpeg4"
          Type: "video/mp4"
          Type: "video/3gp"
          Type: "video/3gpp"
          Type: "video/3gpp2"
          Type: "application/sdp"
      androidx.activity.result.contract.action.PICK_IMAGES:
        2b8c15d com.google.android.gms/.photopicker.ui.PhotoPickerActivity filter b2e6b61
          Action: "androidx.activity.result.contract.action.PICK_IMAGES"
          Category: "android.intent.category.DEFAULT"
          Type: "image"
          Type: "video"
          mPriority=0, mOrder=0, mHasPartialTypes=true"""

conv2 = indent2dict(data2, removespaces=True)
print(conv2)

{
    "MIME Typed Actions:": {
        "com.android.camera.action.REVIEW:": {
            "222a358 com.android.gallery3d/.app.GalleryActivity filter ca957c3": {
                'Action: "android.intent.action.VIEW"': 5,
                'Action: "com.android.camera.action.REVIEW"': 6,
                'Category: "android.intent.category.DEFAULT"': 7,
                'Category: "android.intent.category.BROWSABLE"': 8,
                'Scheme: ""': 9,
                'Scheme: "http"': 10,
                'Scheme: "https"': 11,
                'Scheme: "content"': 12,
                'Scheme: "file"': 13,
                'Type: "image"': 14,
                'Type: "application/vnd.google.panorama360+jpg"': 15,
                "mPriority=0, mOrder=0, mHasPartialTypes=true": 16,
            },
            "222a358 com.android.gallery3d/.app.GalleryActivity filter a9f840": {
                'Action: "com.android.camera.action.REVIEW"': 18,
                'Category: "android.intent.category.DEFAULT"': 19,
                'Category: "android.intent.category.BROWSABLE"': 20,
                'Scheme: "http"': 21,
                'Scheme: "https"': 22,
                'Scheme: "content"': 23,
                'Scheme: "file"': 24,
                'Type: "video/mpeg4"': 25,
                'Type: "video/mp4"': 26,
                'Type: "video/3gp"': 27,
                'Type: "video/3gpp"': 28,
                'Type: "video/3gpp2"': 29,
                'Type: "application/sdp"': 30,
            },
        },
        "androidx.activity.result.contract.action.PICK_IMAGES:": {
            "2b8c15d com.google.android.gms/.photopicker.ui.PhotoPickerActivity filter b2e6b61": {
                'Action: "androidx.activity.result.contract.action.PICK_IMAGES"': 33,
                'Category: "android.intent.category.DEFAULT"': 34,
                'Type: "image"': 35,
                'Type: "video"': 36,
                "mPriority=0, mOrder=0, mHasPartialTypes=true": 37,
            }
        },
    }
}

Metadata

Release files for indent2dict 0.10

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for indent2dict 0.10
File Size Uploaded Provenance Actions
indent2dict-0.10.tar.gz 11.7 kB Without provenance Details for indent2dict-0.10.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for indent2dict 0.10
File Interpreter ABI Platform Actions
indent2dict-0.10-py3-none-any.whl Python 3 none any Details for indent2dict-0.10-py3-none-any.whl

Total release size: 23.9 kB

Release files / indent2dict-0.10.tar.gz

Download URL indent2dict-0.10.tar.gz
Size 11.7 kB
Tags Source
SHA-256 checksum
How to use checksums
823d8e18a6654b46c73ea21930c9d24d4a5df0cd35d82514a93379e57d7bc764
BLAKE2b-256 checksum
How to use checksums
0f95fbc7141e0d284c83bd6890b0478a52afee953e27fe8b1d55b08b2c4b8d62
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.11.5

Release files / indent2dict-0.10-py3-none-any.whl

Download URL indent2dict-0.10-py3-none-any.whl
Size 12.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
210a99bf80839b141bbdef873e69858d948014e1d3ab9eb5ca2639b0d2bba220
BLAKE2b-256 checksum
How to use checksums
bfd7c56b0d9a9acfcae572e1117a0df6a92987076fdeaf16d4d64f112bee5e09
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.11.5

Security for indent2dict 0.10

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.10 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page