2016-07-19 1 views
0

json 파일에 특히 문제가 있습니다. 다음 코드는 json을 읽고 txt 파일에 씁니다. 가독성을 높이기 위해 코드를 줄였습니다. 실제 코드에서는 필드가 쓰여지고 문장이 쓰여집니다. 문제는dictionary가 파이썬에서 KeyError를 생성하는 경우 빈 문자열을 file.write()하는 방법

import os 
import json 


def _getjson(filename): 
    """ returns a list of dictionaries """ 
    if not os.path.exists(filename): return [] 
    with open(filename, 'r') as openfileobject: 
     data = json.loads(openfileobject.read()) 
    return data 

def writefile(filename, data): 
    """writes to file""" 
    with open(filename, 'w') as f: 
     for d in data: 
      f.write(d['field1'] + ' ' + d['field2'] + ' ' + d['field3'] + '\n') 
      ## a lot more code here 


def main(): 
    filename = r'c:\input.json' 
    data = _getjson(filename) 
    outfile = r'c:\output.txt' 
    writefile(outfile, data) 

if __name__ == '__main__': 
    main() 

는 때로는 필드 JSON에없는, 그리고 그것은 KeyError 나는 try: except KeyError와 트랩이 할 수있는 동안을 생산하고 있습니다. 그것은 내 writefile 함수의 모든 필드 주위에 시도해 볼 필요가 있음을 의미합니다.

f.write() 문을 변경하지 않고 KeyError에 빈 문자열을 쓰는 방법이 있습니까? (그래서 나는 try 블록의 hundereds에서 이것을 캡쳐 할 필요가 없다)

이것은 사전 문제이다. 나는 json 자체에 아무런 문제가 없다. 입력란에 어떤 입력란이 있는지 제어 할 수 없으므로 하나의 파일에 field1field2이있을 수 있습니다. 그 다음은 3 가지 또는 모두를 가질 수 있습니다. json 파트가 작동하며 일부 필드가 누락 될 수 있습니다.

답변

3

사용 dict.get :

f.write(d.get('field1', '') + ' ' + 
     d.get('field2', '') + ' ' + 
     d.get('field3', '') + '\n') 

get()에 대한 값을 반환하거나 기본 또는 None 주어진다.

+0

같은 genexps를 사용 감사합니다! 그 트릭을 했어! –

+1

다음과 같이'join()'아이디어를 적용 할 수도 있습니다 :''field1 ','field2 ','field3의 k에 대해 f.write (''.join (d.get (k, '')) ']) +'\ n ')' –

2

더 간단하면 str.joindict.values입니다.

f.write(' '.join(d.values()))

또는 값이없는 경우 문자열이

f.write(' '.join(str(value) for value in d.values()))

+0

'd.values ​​()'는 임의의 순서를가집니다. 그건 중요하지 않을 수도 있지만 대부분 그렇습니다. –

+0

'dict.values ​​()'는 파일에 쓰려는 정확한 키를 선택할 수 없기 때문에 (그리고 형식을 지정하고 다른 텍스트를 써 넣을 수 없기 때문에) 나를 위해 작동하지 않습니다 ... 그러나 답변을 주셔서 감사합니다. 트릭, 내가 앞으로 사용할 것입니다! –