4

I have a string, something like this: "[['Cheese', 72], ['Milk', 45], ['Bread', 22]]".

I want to convert this to a list. I know I can use eval(string) to get the list, but eval scares me because of its potential for catastrophe (and because I can get a non-list as valid output). Is there another saner/safer way to turn this string into a list? I know it's a list and anything that isn't a list is invalid data (and should be checked for and/or throw an error).

2
  • 1
    You will want to check out this module: docs.python.org/2/library/ast.html Commented Oct 24, 2013 at 23:56
  • As a bit of background: I inherited a Django app where the previous developer stored a list of items in a database table as a string. It doesn't have to be done that way, and I'm not against using a data migration to convert to JSON, but if there's a "secret handshake" to parse a list, fine by me. Commented Oct 25, 2013 at 0:05

4 Answers 4

6

If you insist on doing it this way, you can use the ast.literal_eval function.

>>> import ast
>>> foo = "[['Cheese', 72], ['Milk', 45], ['Bread', 22]]"
>>> ast.literal_eval(foo)
[['Cheese', 72], ['Milk', 45], ['Bread', 22]]

I'm sure others will tell you that you're likely doing something wrong, or to use a library like JSON to transport arbitrary data structures like this one, and I wouldn't disagree.

Sign up to request clarification or add additional context in comments.

1 Comment

Just in case someone get ValueError, remember to change foo first to string and then apply ast.literal_eval(foo)
4

Try to use the json module:

import json
s = "[['Cheese', 72], ['Milk', 45], ['Bread', 22]]"
s = s.replace("'", '"')
print json.loads(s)

Comments

1

You might consider using the json module to deserialize and making sure your strings are in json format.

See http://docs.python.org/2/library/json.html for details about using this module.

Comments

0

Here's one way: exec("list = "+foo) This should make a variable 'list' with the list in string converted to a real list. This also works for dictionaries, arrays, bools, etc in strings.

1 Comment

I'm not a Python expert. Is this really any better than using eval? Isn't it still just as exploitable?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.