0

의 까다로운 문자열 형태에, 나는 건네있어 defaultdict의 파일이 str() 방법을 사용하여 저장된 텍스트와 UTF8 문자열을 읽 내가 eval()를 사용하는 경우평가 어떻게 든 defaultdict

defaultdict(<class 'set'>, {'protection': {'1058c_204062v_00:39:16->00:39:18_ko'}, 'protect': {'50c_45523v_00:01:22->00:01:24_ko', '5457c_150765v_00:08:34->00:08:37_ko', '5457c_144739v_00:34:25->00:34:28_ko', '1058c_204062v_00:39:36->00:39:39_ko', '504c_68856v_00:15:47->00:15:49_ko'}}) 

, 그것은 예외 :

Traceback (most recent call last): 
    File "consolidate.py", line 9, in <module> 
    print (eval(translation_counter), ast.literal_eval(location)) 
    File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ast.py", line 46, in literal_eval 
    node_or_string = parse(node_or_string, mode='eval') 
    File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ast.py", line 35, in parse 
    return compile(source, filename, mode, PyCF_ONLY_AST) 
    File "<unknown>", line 1 
    defaultdict(<class 'set'>, {'protection': {'1058c_204062v_00:39:16->00:39:18_ko'}, 'protect': {'50c_45523v_00:01:22->00:01:24_ko', '5457c_150765v_00:08:34->00:08:37_ko', '5457c_144739v_00:34:25->00:34:28_ko', '1058c_204062v_00:39:36->00:39:39_ko', '504c_68856v_00:15:47->00:15:49_ko'}}) 
       ^
SyntaxError: invalid syntax 

https://stackoverflow.com/a/4020564/610569에 따르면 ast.literal_eval()도 시도했지만 위와 같은 오류가 발생합니다.

그런 다음 어떻게 든`.replace를 ('_', '_') 사용하여 탈출을 시도하고이를 던졌다 :

Traceback (most recent call last): 
    File "consolidate.py", line 9, in <module> 
    print (eval(translation_counter), ast.literal_eval(location.replace('_', r'\_'))) 
    File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ast.py", line 46, in literal_eval 
    node_or_string = parse(node_or_string, mode='eval') 
    File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ast.py", line 35, in parse 
    return compile(source, filename, mode, PyCF_ONLY_AST) 
    File "<unknown>", line 1 
    defaultdict(<class 'set'>, {'protection': {'1058c\_204062v\_00:39:16->00:39:18\_ko'}, 'protect': {'50c\_45523v\_00:01:22->00:01:24\_ko', '5457c\_150765v\_00:08:34->00:08:37\_ko', '5457c\_144739v\_00:34:25->00:34:28\_ko', '1058c\_204062v\_00:39:36->00:39:39\_ko', '504c\_68856v\_00:15:47->00:15:49\_ko'}}) 
       ^
SyntaxError: invalid syntax 

전체 코드 :

# -*- coding: utf-8 -*- 

from collections import defaultdict, Counter 
import ast 

with open('related.txt', 'r', encoding='utf8') as fin: 
    for line in fin: 
     location = line.strip() 
     print (eval(location)) 

그리고 head -n1 related.txt 다음과 같습니다

defaultdict(<class 'set'>, {'protection': {'1058c_204062v_00:39:16->00:39:18_ko'}, 'protect': {'50c_45523v_00:01:22->00:01:24_ko', '5457c_150765v_00:08:34->00:08:37_ko', '5457c_144739v_00:34:25->00:34:28_ko', '1058c_204062v_00:39:36->00:39:39_ko', '504c_68856v_00:15:47->00:15:49_ko'}}) 

답변

3

<class 'set'>이 eval'd 할 수 없기 때문이다 그. 당신은

p = re.compile(r"^defaultdict\(<class '(\w+)'>") 
c = p.findall(s)[0] 

에서 클래스를 추출하고 그 문자열이 결과

defaultdict(set, 
     {'protect': {'1058c_204062v_00:39:36->00:39:39_ko', 
      '504c_68856v_00:15:47->00:15:49_ko', 
      '50c_45523v_00:01:22->00:01:24_ko', 
      '5457c_144739v_00:34:25->00:34:28_ko', 
      '5457c_150765v_00:08:34->00:08:37_ko'}, 
     'protection': {'1058c_204062v_00:39:16->00:39:18_ko'}}) 
eval 할 수 있어야한다

new_s = s.replace("<class '%s'>"% c, c) 

클래스의 이름으로 대체해야합니다