【问题标题】:Multiple URLs to save json data多个 URL 保存 json 数据
【发布时间】:2019-03-20 14:06:57
【问题描述】:

我正在尝试一次调用多个(超过 10 个 url)并保存所有这 10 个 url 的数据,这些数据将以 json 格式保存并尝试保存在我的位置

这是我尝试过的以下代码,使用它我只能获取保存在我的 json 文件中的最后一个 URL 的数据。如何获取所有 URL 的数据并存储在单个 json 文件中?

import json
import requests

URLs = ['http://httpbin.org/ip',
'http://httpbin.org/user-agent',
'http://httpbin.org/headers']

json_list = []
for url in URLs:
    data = requests.get(url)
    resolvedwo = data.json()
    with open('resolvedworesolution.json', 'w') as f:
         json.dump(resolvedwo, f)

【问题讨论】:

  • 缩进错误。
  • @DirtyBit,复制粘贴问题。目前还不是这个问题
  • @MDI 然后修复复制粘贴,请
  • @C.Nivs,完成..
  • 提示:使用追加模式a进行写作。

标签: python python-3.x python-requests


【解决方案1】:

您的问题是您每次都在循环中覆盖文件。相反,将循环结果存储在一个列表中并仅将其写入文件一次

import requests
import json

URLs = ['http://httpbin.org/ip',
        'http://httpbin.org/user-agent',
        'http://httpbin.org/headers']

json_list = []

for url in URLs:
    data = requests.get(url)
    resolvedwo = data.json()
    json_list.append(resolvedwo)

with open('resolvedworesolution.json', 'w+') as f:
    json.dump(json_list, f, sort_keys=True, indent=4)

输出:

[
    {
        "origin": "137.221.143.66, 137.221.143.66"
    },
    {
        "user-agent": "python-requests/2.21.0"
    },
    {
        "headers": {
            "Accept": "*/*",
            "Accept-Encoding": "gzip, deflate",
            "Host": "httpbin.org",
            "User-Agent": "python-requests/2.21.0"
        }
    }
]

【讨论】:

  • 好的... indent =4 是什么意思?
  • indent=4 表示每行需要缩进4个空格;它只是使 json 文件看起来很漂亮
【解决方案2】:

写入文件时,以w 模式打开文件将在写入之前擦除/截断内容。

with open('resolvedworesolution.json', 'a') as f:

应该可以解决你的问题

【讨论】:

  • 抛出错误:json.decoder.JSONDecodeError: Extra data: line 1 column 605744 (char 605743)
  • 网站内容中的json很有可能是无效的
  • @MDI JSONDecode 是一个json.loads 错误,那么这个错误究竟来自哪里?
  • 这里,实际上错误行不在问题部分,下面是我尝试加载和打开with open('C:\\Users\\ibmha\\PycharmProjects\\Projects\\Resolved_without_Resolution\\resolvedworesolution.json', encoding='utf-8-sig') as f: data = json.load(f)的代码
【解决方案3】:

在写入文件时使用append mode 以“保留”现有数据:

import json
import requests
URLs = ['http://httpbin.org/ip',
'http://httpbin.org/user-agent',
'http://httpbin.org/headers']

json_list = []
for url in URLs:
    data = requests.get(url)
    resolvedwo = data.json()
    with open('resolvedworesolution.json', 'a') as f:   # Using the append mode
        json.dump(resolvedwo, f)
        f.write("\n")                                   # new line for readability

输出

{"origin": "159.122.207.241, 159.122.207.241"}
{"user-agent": "python-requests/2.21.0"}
{"headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.21.0"}}

编辑

您可以一次性将响应写入文件:

with open('resolvedworesolution.json', 'a') as f:
    f.write(str(resolvedwo))
    f.write("\n")

for url in URLs:
    data = requests.get(url)
    with open('resolvedworesolution.json', 'a') as f:
        f.write(data.text)
        f.write("\n")

【讨论】:

  • 抛出错误:json.decoder.JSONDecodeError: Extra data: line 1 column 605744 (char 605743)
  • @MDI 在去这里之前:stackoverflow.com/questions/21058935/… 你能在运行之前确保文件是空的吗?
  • 是的,我清除了文件,然后运行了代码,它抛出了同样的错误
  • 实际上错误行不在问题部分,下面是我尝试加载并打开with open('C:\\Users\\ibmha\\PycharmProjects\\Projects\\Resolved_without_Resolution\\resolvedworesolution.json', encoding='utf-8-sig') as f: data = json.load(f)的代码
  • @MDI try with open('resolvedworesolution.json', 'a', encoding="ISO-8859-1") as f:
【解决方案4】:

您可以将信息存储在可以整体序列化的对象中:

import json
import requests

URLs = ['http://httpbin.org/ip',
'http://httpbin.org/user-agent',
'http://httpbin.org/headers']

json_list = []
for url in URLs:
    data = requests.get(url)
    resolvedwo = data.json()
    json_list.append(resolvedwo)

with open('resolvedworesolution.json', 'w+') as f:
    json.dump(json_list, f)

【讨论】:

  • 抛出错误:json.decoder.JSONDecodeError: Extra data: line 1 column 605744 (char 605743)
  • 立即尝试。您可以将内容存储在 dict 或列表中,并在 for 循环的末尾写下所有内容
  • 对我来说效果很好。我将 'w' 更改为 'w+' 因为我没有该文件,所以它创建它然后写入 json 数据...确保您还没有具有该名称的文件或更改文件名。 ..
【解决方案5】:

代替:

resolvedwo = data.json()

你可能想要:

resolvedwo += data.json()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2018-09-22
    相关资源
    最近更新 更多