2013-10-24 5 views
1

다음과 같은 문자열이 있습니다. "[['Cheese', 72], ['Milk', 45], ['Bread', 22]]".Eval을 사용하지 않고 문자열을 Python으로 변환 하시겠습니까?

목록으로 변환하고 싶습니다. 나는 목록을 얻기 위해 eval (문자열)을 사용할 수 있지만 eval은 재앙에 대한 잠재 성 때문에 나를 겁나게한다. (그리고 나는 비표준을 유효한 출력으로 얻을 수 있기 때문에). 이 문자열을 목록으로 바꾸는 또 다른 건전하고 안전한 방법이 있습니까? 목록이 아니며 목록에없는 내용은 유효하지 않은 데이터입니다 (오류를 확인하거나 오류를 던져야 함).

+1

이 모듈을 체크 아웃해야 할 것입니다. http://docs.python.org/2/library/ast.html – squiguy

+0

배경 지식 : 이전 개발자가 항목 목록을 저장 한 Django 앱을 상속했습니다. 데이터베이스 테이블에서 문자열로. 그런 식으로 처리 할 필요가 없습니다. 데이터 이전을 사용하여 JSON으로 변환하는 것에 반대하는 것이 아니라 목록을 구문 분석하는 "비밀 악"(secret handshake)이있는 경우 저의 도움을 받아야합니다. –

답변

3

이렇게하는 방법을 고집하면 ast.literal_eval 함수를 사용할 수 있습니다.

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

나는 확실히 다른 사람이 가능성이 뭔가 잘못하고 있다는 것을 당신에게 말할 것이다, 또는 이와 같은 임의의 데이터 구조를 수송하기 위해 JSON 같은 라이브러리를 사용하고, 내가 동의하지 않을 것입니다.

+0

누군가 ValueError를 얻는 경우를 대비하여 foo를 먼저 문자열로 변경 한 다음 ast.literal_eval (foo)을 적용하십시오. – techriften

3

봅니다 사용할 수있는 json module :

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

당신은 역 직렬화하는 json 모듈을 사용하고 있는지 확인하여 문자열 json format에 만드는 고려해 볼 수 있습니다.

이 모듈을 사용하는 방법에 대한 자세한 내용은 http://docs.python.org/2/library/json.html을 참조하십시오.

1

여기에 한 가지 방법이 있습니다. exec ("list ="+ foo) 문자열의 목록을 실제 목록으로 변환 한 변수 'list'를 만들어야합니다. 이것은 문자열의 사전, 배열, bool 등에도 적용됩니다.

+0

저는 Python 전문가가 아닙니다. 이것은'eval'을 사용하는 것보다 실제로 더 좋은가? 그것은 여전히 ​​악용 될만한 것이 아닌가? – jerry

관련 문제