2017-12-23 5 views
1

제 코드의 일부 단계에서 파이썬 사전을 json 파일로 덤프해야합니다.파이썬 json.dump는 크기가 0 바이트 인 파일을 생성합니다.

다음
def output_batch(self, batch): 
    with open(os.path.join(self.get_current_job_directory(), 'batch_' + str(self.index) + '.json'), 'w') as json_file: 
     json.dump(batch, json_file, sort_keys = True, indent = 4, separators = (',', ': ')) 
    exit() 

self.index이 특정 인스턴스를 식별하는 고유 한 정수 인덱스 : 여기에 수행하는 코드이다. self.get_current_job_directory()은 파일을 만들 경로를 반환합니다.

덤프하기 직전에 사전의 길이를 기록하면 42691을 반환합니다. 그러나 출력 파일의 크기는 0 바이트입니다. 이것은 실제로 의미가 없습니다. 빈 dict의 경우에도 파일은 2 바이트 길이가됩니다 ({}을 보완하기 위해).

이 코드는 고도로 병렬화 된 map-reduce 스타일 파이프 라인의 일부이며 여기에서 재현하는 것이 거의 불가능합니다. 그런 설정에서 잘못 될 수있는 일은 백만 가지가되었지만 다른 스레드는 dict에 액세스 할 수 없으며 다른 스레드는 동일한 출력 파일에 액세스하지 않습니다.

*** 업데이트 :이 함수 호출 바로 다음에 (exit()을 호출하여) 프로세스가 종료됩니다. 아마도이 작업과 관련이 있습니까?

왜 이런 일이 발생할 수있는 제안이나 아이디어가 있습니까?

+0

명백한 내용 일지 모르지만 인쇄 (json_file)하고 올바른 파일에 실제로 쓰고 있는지 확인하십시오. – kshikama

+0

@kshikama 예. 나는 이것이 문제가 아니라는 것을 100 % 확신한다. – DarthPaghius

+0

json 덤프를 시도하기 직전에 "Hello World"또는 그 파일에 임의로 쓸 수 있습니까? – kshikama

답변

0

with 컨텍스트가 제대로 끝내지 않고 종료 될 수 있습니다. 명시 적으로 파일을 닫으십시오.

def output_batch(self, batch): 
    json_file = open(...): 
    json.dump(batch, json_file, sort_keys = True, indent = 4, separators = (',', ': ')) 
    json_file.close() 

은 또한, 당신이 쓰기 권한 open('w')를 호출하고 그 장소에 쓸 수있는 권한이 있는지 확인합니다.