Python json.loads에 ValueError: 추가 데이터가 표시됩니다.
JSON 파일 "new.json"에서 데이터를 가져오고 있는데 데이터를 필터링하여 새 JSON 파일에 저장하려고 합니다.코드는 다음과 같습니다.
import json
with open('new.json') as infile:
data = json.load(infile)
for item in data:
iden = item.get["id"]
a = item.get["a"]
b = item.get["b"]
c = item.get["c"]
if c == 'XYZ' or "XYZ" in data["text"]:
filename = 'abc.json'
try:
outfile = open(filename,'ab')
except:
outfile = open(filename,'wb')
obj_json={}
obj_json["ID"] = iden
obj_json["VAL_A"] = a
obj_json["VAL_B"] = b
에러가 발생하고 있습니다.트레이스백은 다음과 같습니다.
File "rtfav.py", line 3, in <module>
data = json.load(infile)
File "/usr/lib64/python2.7/json/__init__.py", line 278, in load
**kw)
File "/usr/lib64/python2.7/json/__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "/usr/lib64/python2.7/json/decoder.py", line 369, in decode
raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 88 column 2 - line 50607 column 2 (char 3077 - 1868399)
여기 new.json의 데이터 샘플이 있습니다. 파일에는 약 1500개의 사전이 더 있습니다.
{
"contributors": null,
"truncated": false,
"text": "@HomeShop18 #DreamJob to professional rafter",
"in_reply_to_status_id": null,
"id": 421584490452893696,
"favorite_count": 0,
"source": "<a href=\"https://mobile.twitter.com\" rel=\"nofollow\">Mobile Web (M2)</a>",
"retweeted": false,
"coordinates": null,
"entities": {
"symbols": [],
"user_mentions": [
{
"id": 183093247,
"indices": [
0,
11
],
"id_str": "183093247",
"screen_name": "HomeShop18",
"name": "HomeShop18"
}
],
"hashtags": [
{
"indices": [
12,
21
],
"text": "DreamJob"
}
],
"urls": []
},
"in_reply_to_screen_name": "HomeShop18",
"id_str": "421584490452893696",
"retweet_count": 0,
"in_reply_to_user_id": 183093247,
"favorited": false,
"user": {
"follow_request_sent": null,
"profile_use_background_image": true,
"default_profile_image": false,
"id": 2254546045,
"verified": false,
"profile_image_url_https": "https://pbs.twimg.com/profile_images/413952088880594944/rcdr59OY_normal.jpeg",
"profile_sidebar_fill_color": "171106",
"profile_text_color": "8A7302",
"followers_count": 87,
"profile_sidebar_border_color": "BCB302",
"id_str": "2254546045",
"profile_background_color": "0F0A02",
"listed_count": 1,
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"utc_offset": null,
"statuses_count": 9793,
"description": "Rafter. Rafting is what I do. Me aur mera Tablet. Technocrat of Future",
"friends_count": 231,
"location": "",
"profile_link_color": "473623",
"profile_image_url": "http://pbs.twimg.com/profile_images/413952088880594944/rcdr59OY_normal.jpeg",
"following": null,
"geo_enabled": false,
"profile_banner_url": "https://pbs.twimg.com/profile_banners/2254546045/1388065343",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"name": "Jayy",
"lang": "en",
"profile_background_tile": false,
"favourites_count": 41,
"screen_name": "JzayyPsingh",
"notifications": null,
"url": null,
"created_at": "Fri Dec 20 05:46:00 +0000 2013",
"contributors_enabled": false,
"time_zone": null,
"protected": false,
"default_profile": false,
"is_translator": false
},
"geo": null,
"in_reply_to_user_id_str": "183093247",
"lang": "en",
"created_at": "Fri Jan 10 10:09:09 +0000 2014",
"filter_level": "medium",
"in_reply_to_status_id_str": null,
"place": null
}
다음 예에서 볼 수 있듯이json.loads
(그리고json.load
)는 여러 json 개체를 디코딩하지 않습니다.
>>> json.loads('{}')
{}
>>> json.loads('{}{}') # == json.loads(json.dumps({}) + json.dumps({}))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\json\__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "C:\Python27\lib\json\decoder.py", line 368, in decode
raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 1 column 3 - line 1 column 5 (char 2 - 4)
여러 사전을 덤프하는 경우 여러 사전을 덤프하는 대신 목록으로 래핑하여 목록을 덤프합니다.
>>> dict1 = {}
>>> dict2 = {}
>>> json.dumps([dict1, dict2])
'[{}, {}]'
>>> json.loads(json.dumps([dict1, dict2]))
[{}, {}]
그냥 파일에서 읽을 수 있어요jsonifying
각 행은 다음과 같습니다.
tweets = []
for line in open('tweets.json', 'r'):
tweets.append(json.loads(line))
이렇게 하면 중간 python 개체가 저장되지 않습니다.트윗을 1개씩 작성하면append()
전화, 이거면 될 거야
MongoDB에서 덤프된 JSON 파일을 로드하려다 우연히 알게 되었습니다.그것은 나에게 오류를 주고 있었다.
JSONDecodeError: Extra data: line 2 column 1
MongoDB JSON 덤프는 한 줄에 1개의 오브젝트가 있기 때문에 다음과 같이 동작합니다.
import json
data = [json.loads(line) for line in open('data.json', 'r')]
이 문제는 JSON 파일이 1개의 JSON 레코드만이 아닌 경우에도 발생할 수 있습니다.JSON 레코드는 다음과 같습니다.
[{"some data": value, "next key": "another value"}]
괄호 [ ]로 열리고 닫힙니다.괄호 안에는 중괄호 { }가 있습니다.여러 쌍의 브레이스를 사용할 수 있지만 모두 닫는 괄호로 끝납니다.json 파일에 다음 중 하나 이상이 포함되어 있는 경우:
[{"some data": value, "next key": "another value"}]
[{"2nd record data": value, "2nd record key": "another value"}]
loads()는 실패합니다.
저는 이 문제를 제 파일로 확인했습니다.
import json
guestFile = open("1_guests.json",'r')
guestData = guestFile.read()
guestFile.close()
gdfJson = json.loads(guestData)
이것은 1_guests.json에 1개의 레코드[]가 있기 때문에 동작합니다.all_guests.json의 원래 파일에는 6개의 레코드가 줄바꿈으로 구분되어 있습니다.5개의 레코드(괄호로 묶어서 부킹한 것을 확인했습니다)를 삭제하고, 파일을 새로운 이름으로 보존했습니다.그리고 loads 문이 작동했습니다.
오류는
raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 2 column 1 - line 10 column 1 (char 261900 - 6964758)
추신. 나는 레코드라는 단어를 사용하지만, 그것은 공식적인 이름이 아니다.또한 파일에 나와 같은 줄바꿈 문자가 있는 경우 파일을 루프하여 한 번에 하나의 레코드를 json 변수로 loads()할 수 있습니다.
내 json 파일이 이렇게 되어 있는데도 같은 오류가 발생했습니다.
{"id":"1101010","city_id":"1101","name":"TEUPAH SELATAN"}
{"id":"1101020","city_id":"1101","name":"SIMEULUE TIMUR"}
그리고 그게 잘못된 형태라는 걸 알아냈죠. 그래서 그걸 다음과 같이 바꿨죠.
{
"datas":[
{"id":"1101010","city_id":"1101","name":"TEUPAH SELATAN"},
{"id":"1101020","city_id":"1101","name":"SIMEULUE TIMUR"}
]
}
문제에 대한 한 줄:
data = [json.loads(line) for line in open('tweets.json', 'r')]
이 문제를 이중으로 해결하려면 다음과 같이 할 수 있습니다.
with open('data.json') as f:
data = [json.loads(line) for line in f]
이 에러는,\n
기호(사용하는 경우)read()
파일 설명자의 메서드...이 문제를 회피하기 위해readlines()
& co 하지 & & & & & & & & & &!
import json
path = # contains for example {"c": 4} also on multy-lines
new_d = {'new': 5}
with open(path, 'r') as fd:
d_old_str = fd.read().replace('\n', '') # remove all \n
old_d = json.loads(d_old_str)
# update new_d (python3.9 otherwise new_d.update(old_d))
new_d |= old_d
with open(path2, 'w') as fd:
fd.write(json.dumps(new_d)) # save the dictionary to file (in case needed)
로 사용하고 ...말말면면면면면면면면면readlines()
해결 방법
new_d = {'new': 5}
with open('some_path', 'r') as fd:
d_old_str = ''.join(fd.readlines()) # concatenate the lines
d_old = json.loads(d_old_str)
# then as above
목록에 딕트를 저장하는 것은 @falsetru가 제안하는 이상적인 솔루션이 아니라고 생각합니다.
더 좋은 방법은 dits를 반복하고 새 줄을 추가하여 .json에 저장하는 것입니다.
우리의 두 사전은
d1 = {'a':1}
d2 = {'b':2}
.json에 쓸 수 있습니다.
import json
with open('sample.json','a') as sample:
for dict in [d1,d2]:
sample.write('{}\n'.format(json.dumps(dict)))
그리고 당신은 문제없이 json 파일을 읽을 수 있습니다.
with open('sample.json','r') as sample:
for line in sample:
line = json.loads(line.strip())
심플하고 효율적인
제 json 파일은 질문의 형식과 완전히 일치하지만, 여기에서는 해결 방법이 하나도 없었습니다.마지막으로 다른 Stackoverflow 스레드에서 회피책을 찾았습니다.이 게시물은 구글 검색의 첫 번째 링크이기 때문에 앞으로 이 게시물에 오는 사람들이 더 쉽게 찾을 수 있도록 여기에 그 답을 넣었습니다.
이미 설명한 바와 같이 유효한 json 파일에는 선두에 ""가, 파일 끝에 "]가 필요합니다.또한 각 json 항목 뒤에는 "}" 대신 "}"이(가) 있어야 합니다.따옴표 없이 모든 괄호!이 코드 조각은 잘못된 형식의 json 파일을 올바른 형식으로 수정합니다.
https://stackoverflow.com/a/51919788/2772087
데이터가 사용자가 통제할 수 없는 소스로부터 전송되는 경우 다음을 사용하십시오.
def load_multi_json(line: str) -> [dict]:
"""
Fix some files with multiple objects on one line
"""
try:
return [json.loads(line)]
except JSONDecodeError as err:
if err.msg == 'Extra data':
head = [json.loads(line[0:err.pos])]
tail = FrontFile.load_multi_json(line[err.pos:])
return head + tail
else:
raise err
언급URL : https://stackoverflow.com/questions/21058935/python-json-loads-shows-valueerror-extra-data
'programing' 카테고리의 다른 글
MariaDB SELECT가 다른 트랜잭션이 완료될 때까지 대기하도록 합니다. (0) | 2022.09.28 |
---|---|
python 예외 메시지 캡처 (0) | 2022.09.28 |
스위치 스테이트먼트에서 복귀하는 것이 브레이크 사용보다 더 좋은 방법이라고 생각하십니까? (0) | 2022.09.28 |
Java의 ToLowerCase() 및 ToUpperCase()에서 Locales 사용 (0) | 2022.09.28 |
오류: 요청 엔티티가 너무 큽니다. (0) | 2022.09.28 |