source

Python은 UTF-8 BOM 헤더가 있는 json 파일을 로드합니다.

manysource 2023. 4. 5. 22:03

Python은 UTF-8 BOM 헤더가 있는 json 파일을 로드합니다.

UTF-8 BOM 헤더(EFBBBF)를 사용하여 json 파일을 무조건 출력하는 다른 툴에서 생성된 파일을 해석해야 했습니다.Python 2.7 모듈이 해석할 수 없기 때문에 이것이 문제라는 것을 곧 알게 되었습니다.

>>> import json
>>> data = json.load(open('sample.json'))

ValueError: No JSON object could be decoded

BOM을 제거하면 해결되지만, BOM 헤더가 있는 json 파일을 해석할 수 있는 다른 방법이 있을까요?

다음을 사용하여 열 수 있습니다.codecs:

import json
import codecs

json.load(codecs.open('sample.json', 'r', 'utf-8-sig'))

또는 로 해독합니다.utf-8-sig자신에게 전달하다loads:

json.loads(open('sample.json').read().decode('utf-8-sig'))

심플! Import 할 필요도 없습니다.codecs.

with open('sample.json', encoding='utf-8-sig') as f:
    data = json.load(f)

부터json.load(stream)사용하다json.loads(stream.read())후드 아래에 BOM을 지우는 작은 헤플러 함수를 쓰는 것도 나쁘지 않습니다.

from codecs import BOM_UTF8

def lstrip_bom(str_, bom=BOM_UTF8):
    if str_.startswith(bom):
        return str_[len(bom):]
    else:
        return str_

json.loads(lstrip_bom(open('sample.json').read()))    

스트림을 랩하여 어떻게든 수정해야 하는 다른 상황에서는 에서 상속하는 것을 검토할 수 있습니다.codecs.StreamReader.

키워드로도 할 수 있고

import codecs
with codecs.open('samples.json', 'r', 'utf-8-sig') as json_file:  
    data = json.load(json_file)

또는 그 이상:

import io
with io.open('samples.json', 'r', encoding='utf-8-sig') as json_file:  
    data = json.load(json_file)

만약 이게 일회성이라면, 나한테 효과가 있었던 아주 단순한 첨단 기술 솔루션이라면...

  • 마음에 드는 텍스트에디터로 JSON 파일을 엽니다.
  • 모두 선택
  • 새 파일 만들기
  • 붙여넣기
  • 절약하다.

붐, BOM 헤더가 사라졌습니다!

Linux 명령어로 BOM을 수동으로 제거했습니다.

우선 나는 그것이 있는지 확인한다.efbb bf파일의 바이트, 사용head i_have_BOM | xxd.

그리고 나는 달린다dd bs=1 skip=3 if=i_have_BOM.json of=I_dont_have_BOM.json.

bs=1매회 1바이트를 처리한다.skip=3첫 번째 3바이트를 건너뜁니다.

utf-8-sig를 import json에만 사용하고 있습니다.

with open('estados.json', encoding='utf-8-sig') as json_file:
data = json.load(json_file)
print(data)

언급URL : https://stackoverflow.com/questions/13156395/python-load-json-file-with-utf-8-bom-header