【问题标题】:Unable to write data in a csv file using dictwriter [duplicate]无法使用 dictwriter 在 csv 文件中写入数据 [重复]
【发布时间】:2018-08-20 07:23:20
【问题描述】:

我在 python 中编写了一个脚本来抓取一些 item namesestimated time 以及 reviewsreviewersrating 连接到每个 item name 的网页使用他们的 api 并将它们写入一个csv文件。问题是我下面的脚本可以相应地解析数据,但我不能将它们写入 csv 文件。

但是,当我尝试将它们写入 csv 文件时,我收到以下错误:

Traceback (most recent call last):
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python36-32\demo000000.py", line 71, in <module>
    w.writerow(reviews)
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python36-32\lib\csv.py", line 155, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python36-32\lib\csv.py", line 151, in _dict_to_list
    + ", ".join([repr(x) for x in wrong_fields]))
ValueError: dict contains fields not in fieldnames: 'reviews'

这是我迄今为止尝试过的:

import csv
import requests

url = "https://eatstreet.com/api/v2/restaurants/{}?yelp_site="

res = requests.get("https://eatstreet.com/api/v2/locales/madison-wi/restaurants")
with open('reviews.csv', 'w', newline='') as f:
    w = csv.DictWriter(f,['name','eta','messg','reviewer','rating'])
    w.writeheader()
    for item in res.json():
        itemid = item['id']
        req = requests.get(url.format(itemid))
        if not 'yelpReviews' in req.json():continue
        reviews = {}
        reviews['name'] = req.json()['name']
        reviews['eta'] = req.json()['waitTime']
        reviews['reviews'] = []
        for texualreviews in req.json()['yelpReviews']:
            reviews_data = {'messg':texualreviews['message'],'reviewer':texualreviews['reviewerName'],'rating':texualreviews['rating']}
            reviews['reviews'].append(reviews_data)
        w.writerow(reviews)

任何将抓取的数据写入 csv 文件的帮助将不胜感激。谢谢。

【问题讨论】:

    标签: python json python-3.x csv web-scraping


    【解决方案1】:

    尝试改变。

    w = csv.DictWriter(f,['name','eta','messg','reviewer','rating'])
    

    w = csv.DictWriter(f,['name','eta', 'reviews','reviewer','rating'])
    

    【讨论】:

      【解决方案2】:

      documentation for DictWriter 声明:

      如果传递给writerow() 方法的字典包含不 在 fieldnames 中找到,可选的 extraaction 参数表示 采取什么行动。如果设置为'raise',则默认值为a ValueError 被提出。

      您对writerow() 的调用将字典reviews 作为参数传递,其键是nameetareviews。因此,with 语句正下方的行应该是:

      w = csv.DictWriter(f, ['name', 'eta', 'reviews'])
      

      其他字段不是必需的;如果添加,它们将被填写为空。

      【讨论】:

        【解决方案3】:
        ValueError: dict contains fields not in fieldnames: 'reviews'
        

        以上错误表明在写入 CSV 文件时,映射值不匹配。 将您的代码更改为

         w = csv.DictWriter(f,['name', 'eta', 'reviews', 'reviewer', 'rating'])
        
         ...
        
         for texualreviews in req.json()['yelpReviews']:
           reviews_data = {'reviews':texualreviews['message'],'reviewer':texualreviews['reviewerName'],'rating':texualreviews['rating']}
           reviews['reviews'].append(reviews_data)
           w.writerow(reviews)
        

        【讨论】:

        • @gboffi 感谢您的编辑我想以粗体突出显示更改,这在答案的代码部分是不可能的。
        • 抱歉,使用 Markdown 无法在代码中包含粗体部分。 也许可以直接使用 HTML 来做你想做的事——我的建议是“没必要”。
        猜你喜欢
        • 2017-10-06
        • 1970-01-01
        • 2017-06-27
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2013-07-06
        • 1970-01-01
        • 2020-05-21
        相关资源
        最近更新 更多