我试图编写一个“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文件中的一个示例的图像
你的方法本身并不是错误的,但肯定是非标准的。典型的模式是将您需要的所有内容合并到单个数据结构中,然后
json.dump(...)
只一次。这样,您就不会浪费系统IO资源一次又一次地打开文件。然后,您可以使用json.load(...)
一次加载所有产品:也就是说,有时候你有正当的理由想独立处理不同的物品(在你的情况下是产品),特别是如果收集它们是一个很长的过程,如果中间出现了错误或者如果有这么多的产品,并且你不想同时加载它们,那么你就想达到某种程度的容错能力。但是,您的方法的问题是,您不知道何时停止读取文件以获取每个单独的json对象。如果您想实现这样的效果,只需在每次迭代后编写一个换行符(如果您想使它看起来像一个有效的json,则使用逗号),或者查看^{}
您正在将数据的字符串版本附加到文件中,这会导致括号彼此相邻而没有逗号。这将在尝试读取文件时导致错误
相反,您应该将json文件作为列表开始,将json文件导入到代码中,附加对象,然后重写到文件中
您可以使用类似的代码执行以下操作:
作为一种临时解决方案,如果您想修复json文件,可以在文件的开头和结尾放上方括号(假设没有),将其转换为数组。此外,还可以在数组中的每个对象之间添加逗号
相关问题 更多 >
编程相关推荐