如何在此json输出中分隔这些词典?

2024-06-16 11:08:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个“with open.json”代码,其中写入了多个产品信息。但是,在.json文件中,每个字典不是用逗号分隔的。这是正常的还是我的代码错了

for product in data['prods']:
    product_name = product['name']
    prod_id = product['Id']
    prod_price = product['price']
    link = 'https://24h.pchome.com.tw/prod/' + prod_id
    today = str(datetime.date.today())
    fileName = today + '_' + keyword + '_Pchome.json'
    try:
        with open(fileName, 'a', encoding='utf-8') as f:
             json.dump({
                      "名稱":product_name,
                      "價格":prod_price,
                      "網址":link, 
             }, f, ensure_ascii=False, indent=4, skipkeys=True)
    except Exception as err:
        print(str(err))

已编辑:将我的代码更改为类似这样的内容(因为人们想知道更多信息。)

keyword = str(input('找什麼? '))
pages = 10
parse_word = urllib.parse.quote(keyword)
for page in list(range(1, pages)):
    response = requests.get('https://ecshweb.pchome.com.tw/search/v3.3/all/results?q=' + parse_word + '&page=' + str(page) + '&sort=rnk/dc')
    raw_data = response.content.decode('utf-8')
    data = json.loads(raw_data)
    try:
        myData = []
        for product in data['prods']:
            product_name = product['name']
            prod_id = product['Id']
            prod_price = product['price']
            link = 'https://24h.pchome.com.tw/prod/' + prod_id
            myData.append({
                "名稱":product_name,
                "價格":prod_price,
                "網址":link
            })
            today = str(datetime.date.today())
            fileName = today + '_' + keyword + '_Pchome.json'
            try:
                with open(fileName, 'a', encoding='utf-8') as f:
                    json.dump(myData, f, ensure_ascii=False, indent=4, skipkeys=True)
            except Exception as err:
               print(str(err))
    except Exception as err:
        print(str(err))
print('完成!') 

而我的结果就在下面……这次是用双方括号……我做错什么了吗

[
    {
        "名稱": "ASUS VivoBook Flip TP470EA-0112K1135G7 黑(i5-1135G7/8G/512G PCIe/Touch/Glare/W10/FHD/14)",
        "價格": 27900,
        "網址": "https://24h.pchome.com.tw/prod/DHAFLY-A900BKJJV"
    }
][
    {
        "名稱": "ASUS VivoBook Flip TP470EA-0112K1135G7 黑(i5-1135G7/8G/512G PCIe/Touch/Glare/W10/FHD/14)",
        "價格": 27900,
        "網址": "https://24h.pchome.com.tw/prod/DHAFLY-A900BKJJV"
    },
    {
        "名稱": "ASUS X515JF-0281G1035G1 星空灰(i5-1035G1/8G/MX130-2G/512G PCIe/W10/FHD/15.6)",
        "價格": 23900,
        "網址": "https://24h.pchome.com.tw/prod/DHAFL9-A900BLVZR"
    }
][
    {
        "名稱": "ASUS VivoBook Flip TP470EA-0112K1135G7 黑(i5-1135G7/8G/512G PCIe/Touch/Glare/W10/FHD/14)",
        "價格": 27900,
        "網址": "https://24h.pchome.com.tw/prod/DHAFLY-A900BKJJV"
    },
    {
        "名稱": "ASUS X515JF-0281G1035G1 星空灰(i5-1035G1/8G/MX130-2G/512G PCIe/W10/FHD/15.6)",
        "價格": 23900,
        "網址": "https://24h.pchome.com.tw/prod/DHAFL9-A900BLVZR"
    },
    {
        "名稱": "ASUS X515MA-0471GN4120 星空灰(Celeron N4120/4G/256G PCIe/W10/FHD/15.6)",
        "價格": 14900,
        "網址": "https://24h.pchome.com.tw/prod/DHAFM4-A900BL8H7"
    }

这是我的json文件中的一个示例的图像

Sample from JSON file


Tags: namehttpscomjsontodayprodproductprice
2条回答

你的方法本身并不是错误的,但肯定是非标准的。典型的模式是将您需要的所有内容合并到单个数据结构中,然后json.dump(...)一次。这样,您就不会浪费系统IO资源一次又一次地打开文件。然后,您可以使用json.load(...)一次加载所有产品:

product_data = []
for product in data["prods"]:
    product_name = product["name"]
    prod_id = product["Id"]
    prod_price = product["price"]
    link = "https://24h.pchome.com.tw/prod/" + prod_id
    product_data.append({"名稱": product_name, "價格": prod_price, "網址": link})
try:
    with open(fileName, "w", encoding="utf-8") as f:
        json.dump(product_data, f, ensure_ascii=False, indent=4, skipkeys=True)
except Exception as err:
    print(str(err))

也就是说,有时候你有正当的理由想独立处理不同的物品(在你的情况下是产品),特别是如果收集它们是一个很长的过程,如果中间出现了错误或者如果有这么多的产品,并且你不想同时加载它们,那么你就想达到某种程度的容错能力。但是,您的方法的问题是,您不知道何时停止读取文件以获取每个单独的json对象。如果您想实现这样的效果,只需在每次迭代后编写一个换行符(如果您想使它看起来像一个有效的json,则使用逗号),或者查看^{}

您正在将数据的字符串版本附加到文件中,这会导致括号彼此相邻而没有逗号。这将在尝试读取文件时导致错误

相反,您应该将json文件作为列表开始,将json文件导入到代码中,附加对象,然后重写到文件中

您可以使用类似的代码执行以下操作:

myData = json.load(open(fileName))

for product in data['prods']:
  product_name = product['name']
  prod_id = product['Id']
  prod_price = product['price']
  link = 'https://24h.pchome.com.tw/prod/' + prod_id
  today = str(datetime.date.today())
  fileName = today + '_' + keyword + '_Pchome.json'
  myData.append({
    "名稱": product_name,
    "價格": prod_price,
    "網址": link,
  })

try:
  with open(fileName, 'w', encoding='utf-8') as f:
    json.dump(myData, f, ensure_ascii=False, indent=4, shipkeys=True)
except Exception as err:
  print(str(err))

作为一种临时解决方案,如果您想修复json文件,可以在文件的开头和结尾放上方括号(假设没有),将其转换为数组。此外,还可以在数组中的每个对象之间添加逗号

相关问题 更多 >