用于从 url 读取多个 json 的 for 循环
Posted
技术标签:
【中文标题】用于从 url 读取多个 json 的 for 循环【英文标题】:For loop for reading several json from url 【发布时间】:2015-10-18 16:08:54 【问题描述】:我必须创建几个数据集,其中包含几个取自 url 的 json 文件。
我设法以我需要的格式导入了一个:
url = "https://cws01.worldstores.co.uk/api/product.php?product_sku=125T:FT0111"
data = urllib2.urlopen(url).read()
data = json.loads(data)
data = pd.DataFrame(data.items())
data = data.transpose()
data.columns = data.iloc[0]
data = data.drop(data.index[[0]])
因为我有一个很长的 url 列表,所以我需要一个 for 循环,为所有这些重复这段代码。我的尝试是:
for i in urls:
data = urllib2.urlopen(str(i)).read()
data = json.loads(data)
data = pd.DataFrame(data.items())
data = test.transpose()
data.columns = data.iloc[0]
data = data.drop(data.index[[0]])
df.append(data)
其中 urls 是包含地址的字符串列表,即
"https://cws01.worldstores.co.uk/api/product.php?product_sku=125T:FT0111"
而 df 是一个空数据帧,其列与 for 循环中每个 url 生成的数据帧中的列相同
当我运行它时,我不断收到以下错误:
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
当我为单个 url 运行第一段代码时没有出现的错误。 我做错了什么?
编辑:
一个新的尝试是改变for循环如下:
for i in urls:
data = urllib2.urlopen(str(i)).read()
try:
data = json.loads(data)
except:
print(data)
print(i)
exit(-1)
data = pd.DataFrame(data.items())
data = data.transpose()
data.columns = data.iloc[0]
data = data.drop(data.index[[0]])
df.append(data)
现在我得到错误:
data = pd.DataFrame(data.items())
AttributeError: 'str' object has no attribute 'items'
【问题讨论】:
data = json.loads(data)
线路似乎已经离开...
你是绝对正确的。我添加了,但我不断收到错误消息。我将编辑问题
您的新错误表明其中一个 URL 未返回有效的 JSON。我假设您在第一个 sn-p 中没有一个一个地尝试它们。用try/except
包围json.loads
并打印有问题的i
和/或data
以验证您得到了什么。
我对python比较陌生,你能告诉我正确的语法吗?非常感谢
由于缩进语法,Python 很难在 cmets 中编写,但是...用换行符替换 <CR>
和用空格替换 #
...try:<CR>####data = json.loads(data)<CR>except:<CR>####print(data)<CR>####print(i)<CR>#### exit(-1)<CR>...
【参考方案1】:
或者你可以只使用熊猫原生read_json function
import urllib2
import pandas as pd
url_base = "https://cws01.worldstores.co.uk/api/product.php?product_sku="
products = ["125T:FT0111", "125T:FT0111", "125T:FT0111"]
raw_data_list = []
for sku in products:
url = url_base.format(sku)
try:
raw_data = urllib2.urlopen(url).read()
if raw_data != "":
raw_data_list.append(raw_data)
except:
pass
data = "[" + (",".join(raw_data_list)) + "]"
data = pd.read_json(data, orient='records')
data
【讨论】:
谢谢,但我收到了这个错误:loads(json,precise_float=self.precise_float), dtype=None) ValueError: Expected object or value @johnred 我的答案中的代码对我来说运行良好。你用的是什么版本的熊猫? 我在 Spyder 上运行 python 2.7。我认为它对您有用,因为我拥有的网址列表中有一些空链接。当我尝试导入这些链接时,它们会引发错误。是否可以创建一个仅包含“好”链接的列表,从某种意义上说,过滤掉所有那些失败 data = json.loads(data) 的链接?谢谢。 @johnred 因为我看不到你的结果,所以我很难修复我的代码,但我改变了它以在读取 url 时捕获异常 它不会出错并返回数据。但是,一个 url 的结果给了我 48 列的数据框,我应该将每个新数据行附加到这个数据框。你的返回给我一个 383 行 x 345 列的数据框【参考方案2】:这是因为你的 for 循环中缺少 json.loads() 行
url = "https://cws01.worldstores.co.uk/api/product.php?
product_sku=125T:FT0111"
data = urllib2.urlopen(url).read()
data = json.loads(data)
data = pd.DataFrame(data.items())
data = data.transpose()
data.columns = data.iloc[0]
data = data.drop(data.index[[0]])
for i in urls:
data = urllib2.urlopen(str(i)).read()
data = json.loads(data) # <- ADDED
data = pd.DataFrame(data.items())
data = test.transpose()
data.columns = data.iloc[0]
data = data.drop(data.index[[0]])
df.append(data)
【讨论】:
我添加并编辑了问题,但仍然出现错误以上是关于用于从 url 读取多个 json 的 for 循环的主要内容,如果未能解决你的问题,请参考以下文章
如何在从列表更新路径的for循环中读取多个json? [复制]
Python问题:从一个文件夹中读取多个json文件只加载一个json
用于读取 JSON 格式数据的 BigQuery 表 URL
PySpark 从目录中读取多个 txt 文件为 json 格式
如何从 URL 读取 Windows 应用程序中的大量 xml 文件(从 Windows 应用程序到服务器的多个请求)c#