How to convert a String representation of a Dictionary to a dictionary in Python ?

To convert a string representation of a dictionary into a Python dictionary, you can use the following methods, depending on the string’s format and safety requirements:

1. Using ast.literal_eval() (Recommended for Python-Style Strings)

Use Case: Safely evaluate strings containing Python literals (e.g., None, True, single quotes).

Example:

import ast

# String with Python-style syntax (single quotes, None, booleans)
s = "{'name': 'Alice', 'age': 30, 'is_student': False, 'pet': None}"

# Convert to a dictionary
d = ast.literal_eval(s)

print(d)
# Output: {'name': 'Alice', 'age': 30, 'is_student': False, 'pet': None}

Features:

  • Handles Python-specific syntax (e.g., None, True/False).
  • Safe: Only parses literals, not arbitrary code.

2. Using json.loads() (For JSON-Compliant Strings)

Use Case: Strings formatted as JSON (double quotes, true/false/null).

Example:

import json

# JSON-style string (double quotes, lowercase booleans, null)
s = '{"name": "Alice", "age": 30, "is_student": false, "pet": null}'

# Convert to a dictionary
d = json.loads(s)

print(d)
# Output: {'name': 'Alice', 'age': 30, 'is_student': False, 'pet': None}

Notes:

  • JSON requires double quotes (") and lowercase true/false/null.
  • Converts JSON null to Python None.

3. Using eval() (Unsafe, Not Recommended)

Use Case: Only use if you fully trust the input string (security risk).

Example:

s = "{'name': 'Alice', 'age': 30, 'is_student': False}"

# Convert to a dictionary (UNSAFE!)
d = eval(s)

print(d)
# Output: {'name': 'Alice', 'age': 30, 'is_student': False}

Warnings:

  • Security Risk: Executes arbitrary code (e.g., s = "__import__('os').system('rm -rf /')" would delete files!).
  • Avoid unless the input is fully controlled.

Key Differences

MethodSyntax SupportSafetyUse Case
ast.literal_eval()Python literals (None, True, etc.)SafeGeneral-purpose (recommended)
json.loads()JSON format (null, true, false)SafeJSON data from APIs/files
eval()Any Python code (including functions)UnsafeAvoid unless input is fully trusted

Handling Edge Cases

1. Single vs. Double Quotes

Convert single quotes to double quotes for JSON compatibility:

s = "{'name': 'Alice'}"
s_fixed = s.replace("'", '"')  # Convert to {"name": "Alice"}
d = json.loads(s_fixed)

2. JSON true/false/null to Python True/False/None

json.loads() automatically converts:

  • trueTrue
  • falseFalse
  • nullNone

3. Malformed Strings

Handle errors gracefully:

s = "{'name': 'Alice', age: 30}"  # Missing quotes around 'age'

try:
    d = ast.literal_eval(s)
except SyntaxError:
    print("Invalid string format!")

Full Workflow Example

import ast

def string_to_dict(s):
    try:
        return ast.literal_eval(s)
    except (SyntaxError, ValueError):
        print("Error: Invalid dictionary format")
        return {}

# Test with valid and invalid strings
valid_s = "{'name': 'Alice', 'age': 30}"
invalid_s = "{'name': 'Alice', age: 30}"  # Missing quotes

print(string_to_dict(valid_s))    # {'name': 'Alice', 'age': 30}
print(string_to_dict(invalid_s))  # Error: Invalid dictionary format → {}

Summary

  • Use ast.literal_eval() for Python-style strings (safest and most flexible).
  • Use json.loads() for JSON-formatted strings.
  • Avoid eval() due to security risks.

Leave a Reply

Your email address will not be published. Required fields are marked *