我有这段代码用Python处理一个大文件:
import urllib2, json, csv
import requests
def readJson(url):
"""
Read a json file.
:param url: url to be read.
:return: a json file.
"""
try:
response = urllib2.urlopen(url)
return json.loads(response.read(), strict=False)
except urllib2.HTTPError as e:
return None
def getRoadsTopology():
nodes = []
edges = []
url = "https://data.cityofnewyork.us/api/geospatial/svwp-sbcd?method=export&format=GeoJSON"
data = readJson(url)
print "Done reading road bed"
print "Processing road bed..."
v_index = 0;
roads = 0
for road in data['features']:
n_index = len(nodes)
# (long, lat)
coordinates = road['geometry']['coordinates'][0]
for i in range(0, len(coordinates)):
lat_long = coordinates[i]
nodes.append((lat_long[1], lat_long[0]))
for i in range(n_index, len(nodes)-1-n_index):
print i, i+1
edges.append((i, i+1))
return nodes, edges
有时它可以工作,但很多时候我在不同的行上得到同样的错误:
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 380, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting : delimiter: line 7 column 4 (char 74317829)
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 380, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 5 column 1 (char 72149996)
我想知道是什么导致了这些错误,并且在不同的行,以及我如何解决它。
提供此文件的网站也成功地展示了它:
https://data.cityofnewyork.us/City-Government/road/svwp-sbcd
答案 0 :(得分:3)
看起来您的JSON输入格式不正确。该错误是从raw_decode
抛出的,它是JSON库的一部分 - 所以它在转移到您的处理代码之前就会被转储。结果的不一致将导致我认为JSON可能以某种方式被破坏或未完全交付。
我的下一步是从源中提取JSON,存储在本地文件中,将其保存以确保它有效,然后直接从该文件测试您的程序。
<强>更新强>
好奇,我多次下载了这个文件。他们中的一些人太小了。看来实际尺寸大约是121M。一旦我得到了一些这些,我运行你的程序,用文件加载器替换你的url-loader。它工作得很好,除非我的RAM太少,然后产生一个段错误。
我在DigitalOcean上的虚拟服务器上下载文件最为成功 - 它每次都成功获得。在本地计算机上执行此操作时,该文件被截断,这使我相信可能发送给您JSON的服务器在一段超时时间后切断了流。 DigitalOcean服务器具有大容量吞吐量,平均12 MB / s,在10秒内拉动整个文件。我的本地机器只能拉不到1MB / s,无法完成。它停在2分钟,只有75Mb。发送服务器可能对请求有2分钟的时间限制。
这可以解释为什么他们的页面可以正常工作,但是你的脚本很难实现这一切。地图数据正由另一台服务器处理,该服务器可以在允许的时间内从源中提取数据,然后根据需要逐个流式传输到Web查看器。