2014-12-26 2 views
5

저는 파이썬에 비교적 새로운입니다. 여러 개의 사전이 포함 된 ascii 파일을 읽으려고합니다. 파일의 형식은 다음과 같습니다.파이썬에서 파일에서 여러 사전을 읽는 방법?

{Key1: value1 
key2: value2 
... 
} 
{Key1: value1 
key2: value2 
... 
} 
{ 
... 

파일의 모든 사전은 중첩 된 사전입니다. 사전 목록으로 읽으려고합니다. 이 작업을 수행하는 간단한 방법이 있습니까? 내가 다음 코드를 시도했지만 당신이 작동 얻기 위해 큰 목록에 넣어해야합니다

data = json.load(open('doc.txt')) 
+2

어떤 오류가 발생합니까? – Mhmd

답변

1

을 작동하지 않습니다. 즉

[ 
    {key1: val1, key2: val2, key3: val3, ...keyN: valN} 
    , {key1: val1, key2: val2, key3: val3, ...keyN: valN} 
    , {key1: val1, key2: val2, key3: val3, ...keyN: valN} 
    . 
    . 
    . 
] 

데이터 파일 형식을 변경할 수 없다면 데이터 해석을위한 고유 한 기능을 사용해야 할 것입니다.

+0

실 거예요. 사전 사이에는 쉼표가 없습니다. 사전에는 키 - 값 쌍 사이에 쉼표가 없습니다. – SuperSaiyan

1

내부 요소가 유효한 JSON이면 다음을 수행 할 수 있습니다. 나는 source of simplejson library을 파고 귀하의 유스 케이스에 맞게 수정했습니다. SSCCE는 아래에 있습니다. 것 같은 출력 뭔가 out.txt에서 일부 유사한 JSON과

import re 
import simplejson 

FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL 
WHITESPACE = re.compile(r'[ \t\n\r]*', FLAGS) 

def grabJSON(s): 
    """Takes the largest bite of JSON from the string. 
     Returns (object_parsed, remaining_string) 
    """ 
    decoder = simplejson.JSONDecoder() 
    obj, end = decoder.raw_decode(s) 
    end = WHITESPACE.match(s, end).end() 
    return obj, s[end:] 

def main(): 
    with open("out.txt") as f: 
     s = f.read() 

    while True: 
     obj, remaining = grabJSON(s) 
     print ">", obj 
     s = remaining 
     if not remaining.strip(): 
      break 

.. : 당신의 입력 파일의 데이터 이후

> {'hello': ['world', 'hell', {'test': 'haha'}]} 
> {'hello': ['world', 'hell', {'test': 'haha'}]} 
> {'hello': ['world', 'hell', {'test': 'haha'}]} 
+0

완벽하게 작동 정말 고마워, 정말 고마워. – Rahul

+0

사전에 함수로 사용되는 값이 몇 개 있습니다. 예를 에 대한 ' {key11 : 기능 (argument11) key12 : {dict11}} {key21 : 기능 (argument12) key22 : {dict21}}에 ' 이 가능이 사전을 읽는 코드를 확장합니다. – Rahul

+0

더 명확한 예를 들려 줄 수 있습니까? 실제 데이터의 간결한 버전 일 수 있습니다. 'key11','function (argument11)'에서 원래 데이터의 구조를 만드는 것이 매우 어렵습니다. - 따옴표가 포함되어 있습니까? 쉼표가 포함되어 있습니까? 함수를 호출해야합니까? 등등. 질문을 편집하고 샘플 입력과 출력으로 업데이트해야합니다. – SuperSaiyan

2

는 JSON 파이썬 정말 아니다, 당신을 문자 형식을 객체 직접 파싱 할 필요가 있습니다. 사전에 허용되는 키와 값이 무엇인지 명시하지 않았으므로 다음은 영숫자 문자열 만 허용합니다.

그래서라는 다음 내용 doc.txt와 입력 파일 주어진다 :

{key1: value1 
key2: value2 
key3: value3 
} 
{key4: value4 
key5: value5 
} 

다음 읽고 숫자 키와 값 이루어지는 사전 파이썬리스트로 변환 :

from pprint import pprint 
import re 

dictpat = r'\{((?:\s*\w+\s*:\s*\w+\s*)+)\}' # note non-capturing (?:) inner group 
itempat = r'(\s*(\w+)\s*:\s*(\w+)\s*)'  # which is captured in this expr 

with open('doc.txt') as f: 
    lod = [{group[1]:group[2] for group in re.findall(itempat, items)} 
           for items in re.findall(dictpat, f.read())] 

pprint(lod) 

출력 :

[{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}, 
{'key4': 'value4', 'key5': 'value5'}] 
0
import re 

fl = open('doc.txt', 'rb') 

result = map(
    lambda part: dict(
     re.match(
      r'^\s*(.*?)\s*:\s*(.*?)\s*$', # splits with ':' ignoring space symbols 
      line 
     ).groups() 
     for line in part.strip().split('\n') # splits with '\n', new line is a new key-value 
    ), 
    re.findall(
     r'\{(.*?)\}', # inside of { ... } 
     fl.read(), 
     flags=re.DOTALL # considering '\n'-symbols 
    ) 
) 

fl.close() 
관련 문제