我在编程和Python方面有点白痴。我知道这些在以前的问题中有很多解释,但我仔细阅读了所有这些,但我没有找到解决方案。
我正在尝试读取一个包含大约10亿个数据的JSON文件:
334465|{"color":"33ef","age":"55","gender":"m"}
334477|{"color":"3444","age":"56","gender":"f"}
334477|{"color":"3999","age":"70","gender":"m"}
我努力克服每行开头的6位数字,但我不知道如何读取多个JSON对象? 这是我的代码,但我找不到它为什么不起作用?
import json
T =[]
s = open('simple.json', 'r')
ss = s.read()
for line in ss:
line = ss[7:]
T.append(json.loads(line))
s.close()
这就是我得到的错误:
ValueError: Extra Data: line 3 column 1 - line 5 column 48 (char 42 - 138)
任何建议对我都有帮助!
答案 0 :(得分:7)
您的代码逻辑存在一些问题。
ss = s.read()
将整个文件s
读入单个字符串。下一行
for line in ss:
逐个迭代该字符串中的每个字符。所以在每个循环line
上都是一个字符。在
line = ss[7:]
您将获得除前7个字符(在0到6位置之外)的整个文件内容,并将line
的先前内容替换为该字符。然后
T.append(json.loads(line))
尝试将其转换为JSON并将生成的对象存储到T
列表中。
这里有一些代码可以满足您的需求。我们不需要将整个文件读入包含.read
的字符串,或者将其读入带有.readlines
的行列表中,我们可以简单地将文件句柄放入for循环中,这将迭代逐行扫描文件。
我们使用with
语句打开文件,以便在我们退出with
块时自动关闭,或者如果出现IO错误。
import json
table = []
with open('simple.json', 'r') as f:
for line in f:
table.append(json.loads(line[7:]))
for row in table:
print(row)
<强>输出强>
{'color': '33ef', 'age': '55', 'gender': 'm'}
{'color': '3444', 'age': '56', 'gender': 'f'}
{'color': '3999', 'age': '70', 'gender': 'm'}
我们可以通过在列表解析中构建table
列表来使其更紧凑:
import json
with open('simple.json', 'r') as f:
table = [json.loads(line[7:]) for line in f]
for row in table:
print(row)
答案 1 :(得分:3)
如果你使用Pandas,你可以简单地写
df = pd.read_json(f, lines=True)
根据文档lines=True
:
每行读取一个json对象文件。
答案 2 :(得分:0)
您应该使用var input = document.getElementById('target');
input2= input+"dubai ";
var searchBox = new google.maps.places.SearchBox(input2);
而不是readlines()
,并将您的JSON解析包装在try / except块中。你的行可能包含一个尾随的换行符,这会导致错误。
read()
答案 3 :(得分:0)
非常感谢你!你们是救命的人! 这是我最终提出的代码。我认为这是所有答案的组合!
import json
table = []
with open('simple.json', 'r') as f:
for line in f:
try:
j = line.split('|')[-1]
table.append(json.loads(j))
except ValueError:
# You probably have bad JSON
continue
for row in table:
print(row)