【问题标题】:Using .format() in a dictionary with an API call通过 API 调用在字典中使用 .format()
【发布时间】:2022-01-13 16:04:32
【问题描述】:

我正在进行 api 调用,因此我必须每天手动更改有效负载中的 endDate。我不能在字典中使用 .format() 。有人可以帮忙吗?

当前有效负载:我在其中手动更改 endDate

payload = "{\"dimensions\":[\"AdsetId\",\"Adset\",\"CampaignId\",\"Campaign\",\"Device\",\"Day\",\"Month\",\"Year\",\"Week\",\"Os\"],\"metrics\":[\"AdvertiserCost\",\"Displays\",\"ClickThroughRate\",\"Cpc\",\"AppInstalls\",\"Clicks\"],\"timezone\":\"UTC\",\"advertiserIds\":\"69957\",\"currency\":\"USD\",\"startDate\":\"2022-01-01T00:00:00.0000000+00:00\",\"***endDate\":\"2022-01-13***T00:00:00.0000000+00:00\",\"format\":\"csv\"}"

预期有效载荷:

payload = "{\"dimensions\":[\"AdsetId\",\"Adset\",\"CampaignId\",\"Campaign\",\"Device\",\"Day\",\"Month\",\"Year\",\"Week\",\"Os\"],\"metrics\":[\"AdvertiserCost\",\"Displays\",\"ClickThroughRate\",\"Cpc\",\"AppInstalls\",\"Clicks\"],\"timezone\":\"UTC\",\"advertiserIds\":\"69957\",\"currency\":\"USD\",\"startDate\":\"2022-01-01T00:00:00.0000000+00:00\",\endDate\":\"{}T00:00:00.0000000+00:00\",\"format\":\"csv\"}".format(today)

今天是今天日期的变量

【问题讨论】:

  • *** 真的存在于有效负载中吗?
  • 不..让我编辑一下
  • 你能发布一个更小的例子吗?我们不需要每个参数来查看问题。那是一个字符串,而不是字典,格式可以很好地使用它。那是JSON吗?您可以编写一个 python dict,添加您想要的日期并使用 json 模块进行序列化。
  • 虽然有可能,但正确的答案是根本不使用格式。它是 JSON 格式的字符串,所以使用 json.loads(payload) 对其进行序列化,进行所有必要的修改并使用 json.dumps(dictionary, separators=(',', ':')) (获取没有额外空格的 JSON 字符串所需的separators 参数)将修改后的字典转换回字符串 .

标签: python api string.format


【解决方案1】:

这是一个字符串,而不是字典,您想要的 .format 可以正常工作。猜测这实际上是 JSON 数据,做这种事情的正常方法是构建一个 python dict 并稍后将其序列化。使用python“f-string”可以很容易地在字符串格式规范本身中调用函数。 datetime.datetime.utcnow() 给出当前的 UTC 时间。它可以转换为date,其isoformat 方法会写入您想要的格式。所以,

import datetime as dt
import json

data = {
    "dimensions": ["AdsetId", "Adset", "CampaignId", "Campaign",
        "Device", "Day", "Month", "Year", "Week", "Os"],
    "metrics": ["AdvertiserCost", "Displays", "ClickThroughRate", 
        "Cpc", "AppInstalls", "Clicks"],
    "timezone": "UTC", 
    "advertiserIds": "69957", 
    "currency": "USD", 
    "startDate": "2022-01-01T00:00:00.0000000+00:00", 
    "endDate": f"{dt.datetime.utcnow().date().isoformat()}T00:00:00.0000000+00:00", 
    "format": "csv"}
    
    
payload = json.dumps(data)
print(payload)

【讨论】:

  • 这解决了问题!谢谢! @tdelaney
  • @tdelaney,顺便说一下,你不需要明确地调用.isoformat()(省略它)。引用 date.__str__ 文档:“对于日期 dstr(d) 等同于 d.isoformat()”。
【解决方案2】:

在我看来,一个非常直接的方法是按照@Olvin Roght 在comment 中的建议,基本上是这样的:

  1. 使用 json.loads() 将有效负载转换为字典。
  2. 修改字典中的"endDate"
  3. 将字典转换回字符串。

这根本不涉及.format()

from datetime import datetime, timezone
import json

payload = "{\"dimensions\":[\"AdsetId\",\"Adset\",\"CampaignId\",\"Campaign\",\"Device\",\"Day\",\"Month\",\"Year\",\"Week\",\"Os\"],\"metrics\":[\"AdvertiserCost\",\"Displays\",\"ClickThroughRate\",\"Cpc\",\"AppInstalls\",\"Clicks\"],\"timezone\":\"UTC\",\"advertiserIds\":\"69957\",\"currency\":\"USD\",\"startDate\":\"2022-01-01T00:00:00.0000000+00:00\",\"endDate\":\"2022-01-13T00:00:00.0000000+00:00\",\"format\":\"csv\"}"
payload = json.loads(payload)
dt = datetime.now(timezone.utc).replace(minute=0, hour=0, second=0, microsecond=0)
payload["endDate"] = dt.isoformat(timespec="microseconds")
print(json.dumps(payload, indent=4))

输出:

{
    "dimensions": [
        "AdsetId",
        "Adset",
        "CampaignId",
        "Campaign",
        "Device",
        "Day",
        "Month",
        "Year",
        "Week",
        "Os"
    ],
    "metrics": [
        "AdvertiserCost",
        "Displays",
        "ClickThroughRate",
        "Cpc",
        "AppInstalls",
        "Clicks"
    ],
    "timezone": "UTC",
    "advertiserIds": "69957",
    "currency": "USD",
    "startDate": "2022-01-01T00:00:00.0000000+00:00",
    "endDate": "2022-01-13T00:00:00.000000+00:00",
    "format": "csv"
}

【讨论】:

  • @Olvin:这段代码肯定产生了没有错误的输出——而当前的accepted answer 并没有按照 OP 的要求执行,无论其中的代码是否会运行。
【解决方案3】:

如果您的有效负载是一个字符串,而您只是希望能够使用特定变量对其进行格式化,您可以使用 f-strings,例如:

today = datetime.strftime(datetime.now(), "%Y-%m-%d")

payload = f"{\"dimensions\":[\"AdsetId\",\"Adset\",\"CampaignId\",\"Campaign\",\"Device\",\"Day\",\"Month\",\"Year\",\"Week\",\"Os\"],\"metrics\":[\"AdvertiserCost\",\"Displays\",\"ClickThroughRate\",\"Cpc\",\"AppInstalls\",\"Clicks\"],\"timezone\":\"UTC\",\"advertiserIds\":\"69957\",\"currency\":\"USD\",\"startDate\":\"2022-01-01T00:00:00.0000000+00:00\",\endDate\":\"{today}T00:00:00.0000000+00:00\",\"format\":\"csv\"}"

【讨论】:

  • 不,它不会,因为你使用了双花括号。
  • 我不是在开玩笑,除了初始化两个常量字符串之外,您的答案中的代码实际上什么都不做。而且它与主题几乎没有关系。
  • 不,最后一次编辑变得更糟...
  • 哈哈!谢谢@OlvinR​​oght
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
相关资源
最近更新 更多