用于从 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#

从 URL 读取 JSON 正在读取奇怪的浮点数