2016-05-14 83 views
1

这是我第一次尝试在Python中使用JSON文件,虽然我已经阅读了很多关于此问题的内容,但我仍然很困惑。我想逐行读取名为jason.json的文件,将其存储到名为data的列表中,然后将其打印出来。但是,我总是得到以下错误:在python中打开JSON文件

Traceback (most recent call last): 
    File "try.py", line 6, in <module> 
    data.append(json.loads(line)) 
    File "C:\Users\...\Python35\lib\json\__init__.py", line 319, in loads 
    return _default_decoder.decode(s) 
    File "C:\Users\...\Python35\lib\json\__init__.py", line 339, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "C:\Users\...\Python35\lib\json\__init__.py", line 355, in raw_decode 
    obj, end = self.scan_once(s, idx) 
    json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 2 column 1 (char 2) 

这是我的代码:

import json 
data = [] 
with open('jason.json') as f: 
    for line in f: 
     data.append(json.loads(line)) 

print(data) 

这是jason.json:

{ 
    "E(2,3)" : "A common Afro-Cuban drum pattern", 
    "E(2,5)" : "A rhythm found in Greece", 
    "E(3,4)" : "It is the archetypal pattern of the Cumbia from Colombia", 
    "E(3,5)" : "Persian rhythm" 
} 

预先感谢您!

+0

你需要下载一气呵成的整个文件的东西;每个行都是**不是**有效的JSON。 – jonrsharpe

+0

@Martijn彼得斯解决方案是要走的路。但是,您遇到此问题的原因是您可能手动创建了该文件,或者从其他位置复制了该文件,以致它有换行符。通常.json文件没有换行符,因此您唯一的行将是有效的json。您可以使用'json.dump(my_data,my_file)'将数据结构保存到文件中,它不会有换行符,并且您可以(尽管不建议)使用您的方法加载它。 – Akavall

+0

@Akavall:不,JSON很容易有换行符。例如,使用'json.dump(my_data,my_file,indent = 4)'。 JSON从来没有被设计成真正被视为单行格式。 –

回答

1

需要注意的是存储在jason.json的数据是一个字典,而不是一个列表。所以,如果你想要一个元组列表,你可以像

with open('jason.json') as f: 
    data = list(json.load(f).items()) 
print(data) 

这将产生

[('E(3,5)', 'Persian rhythm'), ('E(3,4)', 'It is the archetypal pattern of the Cumbia from Colombia'), ('E(2,3)', 'A common Afro-Cuban drum pattern'), ('E(2,5)', 'A rhythm found in Greece')] 
+0

谢谢,这真的有帮助! –

3

您正在阅读的行文件行,但是从你的文件的单行不是有效的JSON文件:

>>> import json 
>>> json.loads('{\n') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.5/json/__init__.py", line 319, in loads 
    return _default_decoder.decode(s) 
    File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.5/json/decoder.py", line 339, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.5/json/decoder.py", line 355, in raw_decode 
    obj, end = self.scan_once(s, idx) 
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 2 column 1 (char 2) 

解码的整个文件一气呵成;这是最简单的与json.load()函数来完成:

with open('jason.json') as f: 
    data.append(json.load(f)) 
+1

我认为它是data = json.load(f)数据还不存在 – PyNEwbie

+0

@PyNEwbie:在这个问题中,'data = []'是在'with'语句之前定义的。我只关注'with'块。 –

+0

我也认为他不知道什么是json对象,他似乎认为添加键,值对是什么数据应该是 – PyNEwbie