Python Forum
extract a dictionary from a string
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
extract a dictionary from a string
#1
Hello everyone
Please help me solve my little problem.
Created an object in canvas tkinter (canvas.create_image(bot['coord'], image = bot['image'], tags = ('bot', bot ['name'], tag1))) and passed the dictionary as a tag (tag1) - {'name': 'bot_28', 'coord': (610, 160), 'health': 0.99, 'live': 0, 'age': 0, 'speed': 0.41, 'orient': 7, 'cargo': [], 'atak': 0.521, 'radar': 25, 'step': 0, 'near': [], 'image': <PIL.ImageTk.PhotoImage object at 0x000001D3269081D0>}. The dictionary in the tag gets the string type.
Now I need to extract it, but I can't convert it back from a string to a dictionary - an error appears ('str' object has no attribute 'keys' - I wanted to see all the dictionary keys). I don't know how to fix it?
Reply
#2
Have you tried using json.loads(string)?
Reply
#3
...
...

bot['name']   = 'bot_' + str(i) 
bot['coord']  = coord          
bot['gender'] = random.choice(gender) 
bot['healt']  = 0.99                  
bot['gormon'] = 0.5                   
bot['live']   = 0                                        
bot['age']    = 0                                       
bot['speed']  = round((random.random()), 2)             
bot['orient'] = random.randint(0, 7)
bot['cargo']  = []                                       
bot['atak']   = round((random.random()), 3)              
tag1          = bot
bot['canvas'] = canvas2.create_image(bot['coord'], image = bot['image'], tags = ('bot', bot['name'], tag1))

...
...

collide = canvas2.find_overlapping(x1r, y1r, x2r, y2r)
if len(collide) > 1:
    i = 0
    for i1 in collide:
        if str(canvas2.gettags(collide[i])[1]) != str(bot['name']):
            vis = canvas2.gettags(collide[i])
                
            print(str(name) + '  0 vis: '+str(vis[0]))
            print(str(name) + '  1 vis: '+str(vis[1]))
            print(str(name) + '  2 vis: '+str(vis[2]))

            if vis[0] == 'bot':
                bott = vis[2]
                print(bott.keys())


Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\berckut\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\berckut\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 749, in callit
    func(*args)
  File "ai_bot_01.py", line 460, in collide_bot
    print(bott.keys())
AttributeError: 'str' object has no attribute 'keys'
Yes, I used json, I used ele... It still leaves an error
Reply
#4
The error is pretty clear. Why do you expect bott (and hence vis[2]) to be a dict?
Reply
#5
...
...

bot = {}     #[b]in the code snippet did not give this line, but it is[/b]
 
bot['name']   = 'bot_' + str(i) 
bot['coord']  = coord          
bot['gender'] = random.choice(gender) 
bot['healt']  = 0.99                  
bot['gormon'] = 0.5                   
bot['live']   = 0                                        
bot['age']    = 0                                       
bot['speed']  = round((random.random()), 2)             
bot['orient'] = random.randint(0, 7)
bot['cargo']  = []                                       
bot['atak']   = round((random.random()), 3)              
tag1          = bot
bot['canvas'] = canvas2.create_image(bot['coord'], image = bot['image'], tags = ('bot', bot['name'], tag1))
 
...
...
 
collide = canvas2.find_overlapping(x1r, y1r, x2r, y2r)
if len(collide) > 1:
    i = 0
    for i1 in collide:
        if str(canvas2.gettags(collide[i])[1]) != str(bot['name']):
            vis = canvas2.gettags(collide[i])
                 
            print(str(name) + '  0 vis: '+str(vis[0]))
            print(str(name) + '  1 vis: '+str(vis[1]))
            print(str(name) + '  2 vis: '+str(vis[2]))
 
            if vis[0] == 'bot':
                bott = vis[2]
                print(bott.keys())
because initially bot is a dictionary and I pass it to a tag called tag1. vis is a list of all tags retrieved by canvas2.gettags (collide [i]). vis [2] is the third tag in the list of passed tags and with 'print' it is seen as a dictionary (there are key-value pairs)

I solved this problem in a workaround way - I transfer the number of the desired bot to the function (collide_bot (number)), and then, using the bot number from the list of all bots (Bots), I extract the necessary information for a specific bot
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Extract a string between 2 words from a text file OscarBoots 2 271 Nov-02-2021, 08:50 AM
Last Post: ibreeden
  How to extract specific key value pair from string? aditi06 0 860 Apr-15-2021, 06:26 PM
Last Post: aditi06
  Beautify dictionary without converting to string. sharoon 6 1,103 Apr-11-2021, 08:32 AM
Last Post: buran
Question How to extract multiple text from a string? chatguy 2 807 Feb-28-2021, 07:39 AM
Last Post: bowlofred
  Extract continuous numeric characters from a string in Python Robotguy 2 893 Jan-16-2021, 12:44 AM
Last Post: snippsat
  Extract data from large string pzig98 1 963 Jul-20-2020, 12:39 AM
Last Post: Larz60+
  simple f-string expressions to access a dictionary Skaperen 0 699 Jul-15-2020, 05:04 AM
Last Post: Skaperen
  xml.etree.ElementTree extract string values matthias100 2 1,307 Jul-12-2020, 06:02 PM
Last Post: snippsat
  problem coverting string data file to dictionary AKNL 22 2,781 Mar-10-2020, 01:27 PM
Last Post: AKNL
  Extract email addresses from string and store them in a list oslosurfer 2 1,045 Nov-24-2019, 03:35 PM
Last Post: oslosurfer

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020